java设计模式—策略模式

     2022-03-24     362

关键词:

  在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:

  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

  策略模式把一个系列的算法封装到一个系列的具体策略类里面,作为一个抽象策略类的子类或策略接口的实现类。简单地说:准备一组算法,并将每一个算法封装起来,使它们可以互换。

  

  示意性UML图:

  技术分享

  这个模式涉及到3个角色:

  环境(Context)角色:持有一个Strategy抽象策略类或策略接口的引用。

  抽象策略(Strategy)角色:这是一个抽象角色,由一个接口或抽象类实现。此角色声明所有的具体策略类需要重写的方法。

  具体策略(Concrete Strategy)角色:封装了相关的算法或行为。

  示意性实例:

  环境角色

 1 public class Context {
 2     // 持有一个具体策略的对象
 3     private Strategy strategy;
 4     /**
 5      * 构造函数,传入一个具体策略对象
 6      * @param strategy    具体策略对象
 7      */
 8     public Context(Strategy strategy){
 9         this.strategy = strategy;
10     }
11     /**
12      * 策略方法
13      */
14     public void contextInterface(){
15         
16         strategy.strategyInterface();
17     }
18     
19 }

  抽象策略角色

1 public interface Strategy {
2     /**
3      * 策略方法
4      */
5     public void strategyInterface();
6 }

  具体策略角色

1 public class ConcreteStrategyA implements Strategy {
2 
3     @Override
4     public void strategyInterface() {
5         // 相关的业务
6     }
7 
8 }

  

1 public class ConcreteStrategyB implements Strategy {
2 
3     @Override
4     public void strategyInterface() {
5         // 相关的业务
6     }
7 
8 }

 

1 public class ConcreteStrategyC implements Strategy {
2 
3     @Override
4     public void strategyInterface() {
5         // 相关的业务
6     }
7 
8 }

 

  使用场景实例:

  假设某个网站销售各种书籍,对初级会员没有提供折扣,对中级会员提供每本10%的促销折扣,对高级会员提供每本20%的促销折扣。

  折扣是根据以下的3个算法中的1个进行的:

  算法1:对初级会员没有提供折扣。

  算法2:对中级会员提供10%的促销折扣。

  算法3:对高级会员提供20%的促销折扣。

  该实例的UML图:

  技术分享

  折扣接口

1 public interface MemberStrategy {
2     /**
3      * 计算图书的价格
4      * @param booksPrice    图书的原价
5      * @return    计算出打折后的价格
6      */
7     public double calcPrice(double booksPrice);
8 }

  初级会员折扣实现类

 1 public class PrimaryMemberStrategy implements MemberStrategy {
 2 
 3     @Override
 4     public double calcPrice(double booksPrice) {
 5         
 6         System.out.println("对于初级会员的没有折扣");
 7         return booksPrice;
 8     }
 9 
10 }

  中级会员折扣实现类

 

 1 public class IntermediateMemberStrategy implements MemberStrategy {
 2 
 3     @Override
 4     public double calcPrice(double booksPrice) {
 5 
 6         System.out.println("对于中级会员的折扣为10%");
 7         return booksPrice * 0.9;
 8     }
 9 
10 }

 

  高级会员折扣实现类

 

1 public class AdvancedMemberStrategy implements MemberStrategy {
2 
3     @Override
4     public double calcPrice(double booksPrice) {
5         
6         System.out.println("对于高级会员的折扣为20%");
7         return booksPrice * 0.8;
8     }
9 }

 

  价格类

 

 1 public class Price {
 2     // 持有一个具体的策略对象
 3     private MemberStrategy strategy;
 4     /**
 5      * 构造函数,传入一个具体的策略对象
 6      * @param strategy    具体的策略对象
 7      */
 8     public Price(MemberStrategy strategy){
 9         this.strategy = strategy;
10     }
11     
12     /**
13      * 计算图书的价格
14      * @param booksPrice    图书的原价
15      * @return    计算出打折后的价格
16      */
17     public double quote(double booksPrice){
18         return this.strategy.calcPrice(booksPrice);
19     }
20 }

 

  客户端

 

 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         // 选择并创建需要使用的策略对象
 5         MemberStrategy strategy = new AdvancedMemberStrategy();
 6         // 创建环境
 7         Price price = new Price(strategy);
 8         // 计算价格
 9         double quote = price.quote(300);
10         System.out.println("图书的最终价格为:" + quote);
11     }
12 
13 }

 

 

  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。策略算法是相同行为的不同实现。在运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象。把所有的具体策略实现类的共同公有方法封装到抽象类里面,将代码向继承等级结构的上方集中。

  技术分享

  

  策略模式优点:

  1 通过策略类的等级结构来管理算法族。

  2 避免使用将采用哪个算法的选择与算法本身的实现混合在一起的多重条件(if-else if-else)语句。

  策略模式缺点:

  1 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

  2 由于策略模式把每个算法的具体实现都单独封装成类,针对不同的情况生成的对象就会变得很多。

 

  参考资料

  《JAVA与模式》之策略模式

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

java-设计模式-策略模式

策略模式其实就是对各种行为算法的包装,各种不同的行为的算法的分离。属于对象的行为模式。650)this.width=650;"src="http://www.jasongj.com/img/designpattern/strategy/Strategy.png"alt="StrategyPatternClassDiagram"/>策略模式类图,比较简单,没有自己... 查看详情

java设计模式之策略模式

1.策略模式的介绍  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。简单的... 查看详情

java设计模式7.策略模式模板方法模式观察者模式

策略模式策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。环境角色:持有一个抽象策略角色的引用。抽象策略角色:... 查看详情

java策略模式

策略模式策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。这个模式涉及到三个... 查看详情

java设计模式—策略模式

定义    通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。此模式其实就是springIOC思想。优点   1.算法可以自由的切换。   2.避免使用多重条件判断。   3.便于扩展:增加一个策略只需... 查看详情

java设计模式—策略模式

定义    通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。此模式其实就是springIOC思想。优点   1.算法可以自由的切换。   2.避免使用多重条件判断。   3.便于扩展:增加一个策略只需... 查看详情

java之策略模式(大话设计模式)

温故而知新,每次读设计模式都会有不同的体验,坚持每天一个设计模式,直到熟练运用设计模式。策略模式定义了很多完成相同工作的算法,但实现不同,它可以以相同的方式调用所有的算法,减少了算法和调用算法的耦合。... 查看详情

java描述设计模式(22):策略模式

本文源码:GitHub·点这里||GitEE·点这里一、生活场景每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策略模式来描述该流程。publicclassC01_I... 查看详情

java设计模式-策略模式

  第一次好好的看设计模式,可能有不对的地方,大佬们可以下面指出,感谢!  -----------分割线----------  场景:商城打折活动,但是我不确定是打几折,因为换季可能打折力度不一样,8折,9折,满300减50等等等等,这... 查看详情

策略模式

...至于用何种方法取决于我们的选择。我们同样借助《大话设计模式》中实现策略模式的例子来做讲解。超市进 查看详情

java设计模式1-策略模式

策略模式:分别封装行为接口,实现算法族,超类里放行为的接口对象,在子类里具体设定行为对象.原则就是:分离变化部分,封装接口,基于接口编程各种功能.为什么要用策略模式{继承带来的问题:(为策略模式)对类的局部改动,尤其是... 查看详情

java策略模式,comparator

package 设计模式.策略模式;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Iterator;import java.util.List;/** * @dep 查看详情

java设计模式--策略模式

1.策略模式1.1定义策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。1.2底层机制将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现... 查看详情

java设计模式—策略模式

定义    通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。此模式其实就是springIOC思想。优点   1.算法可以自由的切换。   2.避免使用多重条件判断。   3.便于扩展:增加一个策略只需... 查看详情

java设计模式之——策略模式

1、策略模式有什么好处?    策略模式的好处在于你可以动态的改变对象的行为。2、设计原则    设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类... 查看详情

java策略模式(代码片段)

查看详情