`

设计模式之--策略模式

阅读更多

          

            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.策略模式产生了很多策略类。

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

分享到:
评论

相关推荐

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 - 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 访问者模式...

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    设计模式--策略模式java例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常用于替换硬编码的条件语句,使代码更加灵活、可扩展和易于维护。下面我们将详细探讨策略模式的核心概念、实现方式以及在实际...

    JAVA设计模式例程-策略模式

    在众多的设计模式中,策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在这个“JAVA设计模式例程-策略模式”的压缩包中,我们可以深入探讨策略模式的原理及其应用。 策略模式的...

    设计模式解读之--策略模式.pdf

    ### 设计模式解读之策略模式 #### 模式定义与核心思想 策略模式是一种行为设计模式,它使得算法可以独立于使用它的客户而变化。在软件工程中,策略模式允许一组算法封装成一系列的类,它们共享相同的接口,但内部...

    android应用开发设计模式之-策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java编程语言中,尤其是在Android平台上,这种模式能够使我们的代码更加灵活、可扩展且易于维护。 策略模式的核心思想是定义一系列算法,并将每个...

    java设计模式---诙谐易懂版

    1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以互换。策略模式让算法的变化独立于使用算法的客户端。在提供...

    设计模式---策略者模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要在不同时间或根据不同条件执行不同算法的情况。策略模式允许我们将算法封装到独立的可互换的策略类中,使得算法的变化...

    北大青鸟设计模式--策略模式

    北大青鸟关于设计模式的PPT,讲述的非常清晰,对于初学设计模式的人来说,非常有用。本篇是关于策略模式的PPT

    c++设计模式-行为型模式-策略模式

    c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...

    设计模式--策略模式StrategyPattern

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择具体...

    java设计模式--策略模式

    策略模式是Java设计模式中的一种行为模式,它允许在运行时选择算法或策略,从而提供了更大的灵活性。在HeadFirst的《设计模式》一书中,第一章深入浅出地讲解了这一模式,通过实例帮助读者理解其核心概念和应用场景...

    设计模式课件大全

    PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML 设计模式02 设计模式03-创建型模式 ...设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的核心内容之一。本文旨在深入解析这些设计模式,并通过C++实现来帮助读者更好地理解和应用这些模式。 #### 1. 创建型模式 创建型模式关注的是对象的...

    设计模式精解-GoF23种设计模式解析附C++实现源码

    - 策略模式(Strategy):定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,算法的变化不会影响使用算法的客户。 - 模板方法模式(Template Method):在一个方法中定义一个算法的骨架,而将一些...

    设计模式-策略者

    在《设计模式-策略者》这篇文章中,作者深入浅出地介绍了策略模式的基本概念、结构和实现方式。文章可能涵盖了以下几个关键知识点: 1. **模式定义**:策略模式允许在运行时选择不同的算法或策略,提供了一种用面向...

    php设计模式-策略模式-例题学习

    在这个"php设计模式-策略模式-例题学习"的例子中,我们将深入理解策略模式的运用及其在PHP中的实现。 首先,让我们来看看核心的类和接口: 1. `HandStrategyInterface.php`: 这个文件定义了一个接口`...

Global site tag (gtag.js) - Google Analytics