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 DesignMode
{
    //调用层
    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();
        }
    }
}