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 通过基类声明各具体子类,调用子类中的函数
它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。典型的针对接口编程(原文: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();
}
}
}