asp.net—策略模式

一、什么是策略模式

  定义:定义一系列算法,把一个个算法封装成独立类并实现同一个接口,使得它们之间可以相互替换。

二、怎么使用策略模式

  首先模拟一个场景:有一个用户想买车。  可以有多种方式买车:

  (1)我是土豪,全款买   

  (2)5成首付,5成贷款   

  (3)0首付,全贷款   

  抽象策略:定义一个行为接口, 接口内定义一个买车的方法  

//定义一个策略行为接口
public interface IStrategy
{
    //购车
    void BuyCar()
}

  具体策略:把购车方式看作一个个算法封装成独立类并实现购车行为

//购车方式 1
public class FullBuy : IStrategy
{
    public void BuyCar()
    {
        Console.WriteLine("我是土豪,全款买");
    }
}
//购车方式 2
public class HalfLoan : IStrategy
{
    public void BuyCar()
    {
        Console.WriteLine("5成首付,5成贷款");
    }
}
//购车方式 3
public class FullLoan : IStrategy
{
    public void BuyCar()
    {
        Console.WriteLine("0首付,全贷款   ");
    }
}

  环境角色:一个可以维护买车策略的对象

//定义一个类维护操作策略
public class StrategyContext
{
    private IStrategy _myStrategy;
    //初始化并传入具体购车方式
    public StrategyContext(IStrategy myStrategy)
    {
        this._myStrategy = myStrategy;
    }
    //设置具体购车方式
    public void SetStrategy(IStrategy myStrategy)
    {
        this._myStrategy = myStrategy;
    }
    
    public void ExecBuy()
    {
        this._myStrategy.BuyCar();
    }
}
//程序入口
 public class Program
 {
     public static void Main(string[] args)
     {
         //创建购车方式
         IStrategy strategy = new FullBuy();
         //创建操作策略
         StrategyContext myContext = new StrategyContext(strategy);
         //买车
         myContext.ExecBuy();
     }
 }

三、为什么使用策略模式

  在有多种算法相似的情况下,避免使用多重条件语句(使用 if...else 不易维护)  

 //不使用策略模式情况下,实现上面的场景则会使用if...else 或者 switch ... case
 //如果需增加购车方式(或者BuyType改变)则会修改下面代码
 //不符合开闭原则(即对扩展开放,对修改关闭)
 if (BuyType = 1)
     Console.WriteLine("我是土豪,全款买");
 else if (BuyType = 2)
     Console.WriteLine("5成首付,5成贷款");
 else if (BuyType = 3)
     Console.WriteLine("0首付,全贷款   ");

四、应用场景(引用百科)  

  1、 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。

  2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。  

  3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

原文地址:https://www.cnblogs.com/witeem/p/10177982.html