《大话设计模式》笔记Java代码实现(二)策略模式

一、模式定义

Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换。

二、uml图和模式结构

  • 环境(Context)角色:持有一个Strategy类的引用(上下文对象),负责和具体的策略类交互。
  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

三、什么情况下应当使用策略模式

  • 出现同一个算法,有很多不同的实现的情况,可以使用策略模式来把这些“不同的实现”实现成为一个算法的类层次

  • 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况,可以使用策略模式来代替这些条件语句

四、优缺点

1.优点

  • 策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。

  • 避免使用难以维护的多重条件选择语句

  • 更好的扩展

2.缺点

  • 上述策略模式,把分支判断又放回到客户端,要改变需求算法时,还是要去更改客户端的程序。
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。
  • 增加了对象的数目
  • 只适合扁平的算法结构

五、思考

       使用策略模式客户端还是要知道具体使用哪个策略,还是存在耦合。如果用简单工厂模式和策略模式结合我们不需要改变策略类,而是希望改变客户端,让客户端不在去知道具体new哪个对象。
       于是我们改造下客户端和上下文(Context),把分支判断放到到环境角色中,让上下文帮我们选择具体策略。
       简单工厂模式和策略模式的结合,客户端只需要直接创建一个上下文,而不需要知道具体去创建的哪个对象。实际工作中很多业务模型都可以抽象成策略加工厂模式

六、书中实例采用java代码实现

  • 效果图:
  • uml图

因为代码有些长,博客中就不展示了,如有需要可以通过下边的链接下载。

1. 策略模式
点此下载

2. 策略模式与简单工厂模式结合
点此下载

Last modification:April 25th, 2019 at 07:07 pm

2 comments

  1. sc想     Windows 10 /    FireFox

    96宅男福利 https://6wll.com

  2. 糖小侠     Windows 7 /    Google Chrome

    这学期正在学习设计模式这门课,一直找不到学习的诀窍,简单工厂模式和策略这两个模式已经晕头转向了,大佬的博客简洁明了,提纲挈领,并且这个页面也太好看了吧!!

Leave a Comment