策略模式

[ Strategy ]

[ 行为型模式 ]

[
抽象策略角色 : 策略类 , 通常由一个接口或者抽象类实现。
具体策略角色 : 包装了相关的算法和行为。
环境角色 : 持有一个策略类的引用 , 最终给客户端调用。
]


策略模式定义了一系列的算法 , 并将每一个算法封装起来 , 而且使它们还可以相互替换 。策略模式让算法独立于使用它的客户而独立变化。


定义父类(接口)
子类继承父类(接口) , 实现继承的函数
定义 应用场景类(Context) , 在构造函数里 , 根据参数 , 父类引用不同的子类
应用场景类(Context) 定义一个函数 , 里面调用封装的实际函数
客户端程序只需要使用 Context 类 , 调用函数 , 不需要知道 到底是谁执行了什么


策略模式 跟 工厂模式 比较:
策略模式是行为型模式(封装一系列算法)
工厂模式是创建型模式(复杂对象的创建)
策略模式 跟 工厂模式比 , 能够让客户端更少的认识 "其他类"


如果这里用工厂模式 , 那么客户程序这边 就会放一些列的 业务逻辑 来 判断生成对象 , 应该把业务逻辑 和 界面逻辑分开



源码:

public abstract class Payment
{
  public abstract void Payments();
}



public class PaymentA : Payment
{
  public override void Payments()
  {
    Console.WriteLine("PaymentA");
  }
}



public class PaymentB : Payment
{
  public override void Payments()
  {
    Console.WriteLine("PaymentB");
  }
}



public class Context
{
  private Payment payment;

  public Context(string str)
  {
    switch (str)
    {
      case "A":
        payment = new PaymentA();
        break;
      case "B":
        payment = new PaymentB();
        break;
    }
  }

  public void GetResult()
  {
    if (payment != null)
    {
      payment.Payments();
    }
  }
}



class Program
{
  static void Main(string[] args)
  {
    //A , B 付款类型 , 或者是打折程度
    Context context = new Context("B");
这里只需修改 B
    context.GetResult();

    Console.ReadKey();
  }
}

posted on 2012-02-21 11:49  多个马甲  阅读(255)  评论(0编辑  收藏  举报