设计模式2之策略模式

A、介绍
    它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。典型的针对接口编程(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
继承于相同基类的不同子类,调用相同的方法,实现相似(实现同一接口或抽象类)但不同(不同的行为子类)的方法,各实现后的子类可以互相替换。


B、意义
    仅通过改变实例化的对象,不改变对象的调用方法,就可以得到不同的实现。
    一句话:不同的对象实例,执行相同的接口方法(但接口的实现不同),得到不同的执行结果。
    目的:用于封装对象的变化。
    
C、结构
    object   :objectA  、objectB、...
       ^         |          |
       |属       |          |
       |于       |          |
    Ibehavior:behaviorA、behaviorB、...
    
    object obj = new objectA();
    obj.behaviorMethed();


1.行为层(定义多种行为)
1.1 将某一系列具体对象抽象为一类对象,定义一个代表“此类对象的共同抽象行为(比如可包含call、run、eat等)”的接口或抽象类(抽象层)
1.2 定义实现接口或抽象类的具体行为子类(具体层)
2.对象层(定义多种子对象,分别为子对象中不同的“行为”字段赋值)
2.1 定义一个代表此类对象的基类,并在基类中声明一个代表“此类对象的共同抽象行为”的接口或抽象类,并以函数的方式调用此“接口或抽象类的各种抽象行为(比如call、run、eat等)”(抽象层)
2.2 定义基类的各具体子类,在子类中,用“各种行为子类”给基类中的“行为接口或抽象类”赋值(构造函数或后期赋值均可,没有具体限制)(具体层)
3.调用层
3.1 通过基类声明各具体子类,调用子类中的函数


D、实例

using System;
namespace Design_mode
{
	//调用层
	class Program
	{
		public static void Main(string[] args)
		{
			string ret;
			Worker worker;                      //1.声名基类
			worker = new Coder();               //2.具体类负责为基类中的行为接口赋值
			ret = worker.Act();                 //3.调用方法
			worker = new Student();             
			ret = worker.Act();                 //相同的调用方法,但在实现的结果上不同
			
			Console.WriteLine("Press any key to continue . . . ");
			Console.ReadKey(true);
		}
	}
	
																												
	//1.抽象行为接口
	public interface IWork
	{
		String Launch();
	}
	//具体行为子类
	class CoderWork : IWork
	{
		private const string CONTENT = "Code";
		public String Launch()
		{
			Console.WriteLine(CONTENT);
			return CONTENT;
		}
	//具体行为子类
	class StudentWork : IWork
	{
		private const string CONTENT = "Study";
		public String Launch()
		{
			Console.WriteLine(CONTENT);
			return CONTENT;
		}
	}
																												
	//2.对象基类
	class Worker
	{
		protected IWork Work;                      //为该对象引入行为
		public String Act()
		{
			return this.Work.Launch();
		}
	}
	//具体对象子类
	}class Coder : Worker
	{
		public Coder()
		{
			this.Work = new CoderWork();
		}
	}
	//具体对象子类
	class Student : Worker
	{
		public Student()
		{
			this.Work = new StudentWork();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值