`

设计模式之--策略模式

阅读更多

          

            1策略模式的定义

            策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

            开闭原则是指一个软件的实体应当对扩展开放,对修改关闭。即我们在设计一个模块时,应当做到这个模块在不被修改的前提下对扩展开放。
            根据面向对象设计的“开-闭”原则,当有一组算法对于某些应用是必不可少的,客户可能需要
算法的多种不同实现,允许增加新的算法实现或者改变现有的算法实现,在设计时,我们可以把这样的算法封装到单独的类中,称为strategy。策略模式就是从对可变性的东西封装的原则,实现“开闭原则”的模式。

            2策略模式的运用

            每年在新生入学时,由于本科生、硕士生和博士生,他们助学金额的计算方法不同。一般实现:用分支语句。

                             
            public class Test {
                      public static void main(String[] args) {
                               if(student is Granduate){
                                    //xxxxxxx
                                }else if if(student is Master){
                                    //xxxxxxx
                                } if(student is Doctor){
                                    //xxxxxxx
                                }

                        } 
              }  

              如果产生以下二个问题:
              计算方法发生变化;  增加了助学金计算方法(如增加了博士后的助学金) 就要修改客户端的代码,这显然违背了“开闭原则”。

               仔细分析,这个问题的可变性代码就是3个算法,可以考虑先把这3个算法分别用三个类封装起来:
               public class GranduateStipend{
                         public void Payoff(){//本科生计算算法}
               }
               public class MasterStipend{
                         public void Payoff(){//硕士生计算算法}
               }
               public class DoctorStipend{
                         public void Payoff(){//博士生计算算法}
               }
               根据面向抽象编程的原则,可以把3个算法抽象成一个接口或者一个抽象类,并使这3个算法类成为它的子类。 实际中客户端是面对接口编程,而真正的算法实现却是由抽象接口的子类完成,做到了可变的算法和客户实现隔离。
 

              策略模式类图

 

              参与者
              Strategy:定义所有支持的算法的公共接口。

              Context:用一个ConcreteStrategy对象来配置。 维护一个对Strategy对象的引用。 可定义一个接口来让Stategy访问它的数据。
              ConcreteStrategy: 以Strategy接口实现某具体算法。
              协作方法:
              Strategy and Context interact to implement the chosen algorithm A context forwards requests from its clients to its strategy  
              例如:

              public class Context {
                       Strategy stra;
                       public Context(Strategy stra) {
                                 this.stra = stra;
                       }
                       public void doMethod() {

                                 stra.method();

                       }
                }

 

 

 

 

 

                public class Test { 
                public static void main(String[] args) {
                          Context ctx = new Context(new StrategyImplA());
                          ctx.doMethod();
                          ctx = new Context(new StrategyImp()); 

                          ctx.doMethod();
                          ctx = new Context(new StrategyImplC()); ctx.doMethod();
               } 
               }  

               3策略模式的优缺点

               优点:
               1.策略模式提供管理相关算法族的方法。
               2.策略模式提供了可以替代继承的一种方法。
               3.可以使程序避免使用多重选择语句。
               缺点:
               1.策略模式要求客户端必须知道所有的策略类。
               2.策略模式产生了很多策略类。

               例如策略模式只能处理客户端从几种方式中选择一种的情况,不能解决客户端同时选择一种以上的情况。这时策略模式就要和装饰模式共同应用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics