一、什么是策略模式
定义:定义一系列算法,把一个个算法封装成独立类并实现同一个接口,使得它们之间可以相互替换。
二、怎么使用策略模式
首先模拟一个场景:有一个用户想买车。 可以有多种方式买车:
(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、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。