设计模式之策略模式
策略模式将可变的部分从程序抽象分离成算法接口,在该接口下分别封装一系列算法实现。这样不同的算法之间可以互相替换,使客户端可以独立这些算法。
根据面向对象的编程思想,我们通常会采用以下方式解决问题。
-
继承父类
优点:相同场景下代码复用率高
缺点:容易忘记代码的复写,不灵活,不同场景下代码复用率低
-
抽象
优点:由子类覆写父类的抽象方法,比较灵活
缺点:代码复用率低
-
组合
"组合优先于继承"。在类中增加一个私有域,引用另一个已有类的实例,通过调用引用实例的方法获得新的功能,这种设计成为组合。
优点:代码复用率高,易于维护;架构灵活;富有弹性,可以较好适应变化,"开闭原则";消除大量条件语句;
缺点:在客户端程序中需要注入一个具体的strategy算法实现类,客户代码需要了解每一个策略实现的细节;增加了对象的数目。
策略模式的设计原则
-
我们找出需求中需要变化的部分,将它们独立出来,而不是与其他代码混合在一起。
-
面向接口,而不是面向实现编程。通过多态的方式,来适配不同的处理方式。
-
多用组合,少用继承。
策略模式实现步骤
-
通过分离变化得到策略接口strategy
-
为策略接口提供实现类
-
客户端程序持有该策略接口
-
在客户端程序中正确选择并组装调用strategy的实现类
使用场景
-
许多相关的类仅仅是行为差异
-
运行时选择不同的算法变体
-
通过条件语句在多个分支中取其一