C# 设计模式-策略模式
一.介绍
策略模式(Stragety Pattern)。属于行为型模式。它定义了算法(行为)家族,分别封装起来,使得它们之间可以相互替换,此模型让算法(行为)的变化,不会影响到使用该算法(行为)的客户。
二.实现
举个例子,一辆车(Car类)里有轮胎(Tyre类)才能跑(Run),不同情况需要使用不同的轮胎,可以在Run方法里根据if/else去使用不同的轮胎(创建对象),但如果以后情况越来越多,需要的轮胎种类越来越多,就得频繁修改Run方法,这就违反了开闭原则。
又或者说,在同一个轮胎里根据不同情况实现不同功能,但这都有可能需要进行多次修改,同样违反开闭原则。
所以,这种情况就可以使用策略模式。
//环境角色(Context) public class Car { Tyre tyre; public void SetTyre(Tyre tyre) { this.tyre = tyre; } public void Run() { if (tyre != null) { Console.WriteLine(tyre.SetKind() + "跑"); } else { Console.WriteLine("没轮胎跑不了"); } } } //抽象策略角色(Strategy) public abstract class Tyre { public abstract string SetKind(); } //具体策略角色(ConcreteStrategy) public class CommonTyre : Tyre { public override string SetKind() { return "用普通轮胎"; } } //具体策略角色(ConcreteStrategy) public class RainTyre : Tyre { public override string SetKind() { return "用雨胎"; } } //调用 public static void Main(string[] args) { Car c = new Car(); //普通情况,装普通轮胎跑 c.SetTyre(new CommonTyre()); c.Run(); //下雨了,装雨胎 c.SetTyre(new RainTyre()); c.Run(); }
在策略模式下,它将Tyre对象的创建放在了外部,根据不同情况再把不同Tyre对象传到Car对象里,使得Car类不依赖于Tyre类,高层和底层解耦,其实该模式就是符合依赖倒置的设计原则。
三.总结
优点:
1.由于轮胎(策略类)都使用同一个接口,使得它们可以自由切换。
2.易于拓展。新增一个轮胎(策略类)只需要添加一个新的具体轮胎(策略类)就行,基本不需要修改原有代码。
3.避免使用多重条件选择语句,充分体现出面向对象的思想。
缺点:
1.客户端必须知道所有的轮胎(策略类),并决定使用哪一个轮胎(策略类)。
2.策略模式会造成有多个策略类。