java设计模式难以理解,Java设计模式学习篇(十三)策略设计模式

策略设计模式(Strategy Pattern),是一种实现某个功能有多种替换方案的设计模式。比如,我们出去旅游出行,可以选择骑行,也可以选择坐汽车,也可以选择高铁。这里面骑行、坐汽车或坐高铁就是一种选择策略,可替代性的方式。

典型的策略设计模式UML图如下所示。

29ed447287fe5d1721b51b8d5a3b90c1.png

其中,Strategy为抽象的接口(或抽象类),其中定义了AlgorithmInterface方法。下面有三个具体的实现类,分别是ConcreteStrategyA、ConcreteStrategyB和ConcreteStrategyC类,分别实现了自己的AlgorithmInterface方法。

在顶层Context类中,根据调用选择具体的子类中的AlgorithmInterface方法。

下面我们基于Java实现上面介绍的案例,如下所示。

03b10c3f4efb05f9d4ab0e4b48bbd3c4.png

实现代码如下:

(1)定义IStrategy接口

640b59ee63f12470730bc572b100c865.png

(2)IStrategy接口的三个实现类

169c913031ddd8a7adfa68a468801e20.png

0dc3700a5ba664b9ecb3b91aed41448c.png

69b77c5617b8fb67ad37f54f8de44b15.png

(3)Person类

2906cca12d034cbaf08092b6224ee151.png

(4)测试类

a0f4c11a5d74f380b3dce675c9e95099.png

总结:

Strategy模式有下面的一些优点:1) 相关算法系列 。Strategy类层次为Context定义了一系列的可供重用的算法或行为。 继承有助于析取出这些算法中的公共功能。

2) 提供了可以替换继承关系的办法: 继承提供了另一种支持多种算法或行为的方法。你可以直接生成一个Context类的子类,从而给它以不同的行为。但这会将行为硬行编制到 Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,而且还不能动态地改变算法。最后你得到一堆相关的类 , 它们之间的唯一差别是它们所使用的算法或行为。 将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。

3) 消除了一些if else条件语句 :Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时 ,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。

4) 实现的选择 Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间 /空间权衡取舍要求从不同策略中进行选择。

Strategy模式缺点:自己思考!!!

思考1:策略设计模式和简单工厂设计模式区别?

简单工厂设计模式根据传入的键值(比如名称),返回一个具体实例。而策略模式持有一个接口,根据传入的该接口的具体子类调用子类的方法。其传入的是子类的实际对象(比如本例中传入的new AirplaneStrategy())。

思考2:策略模式的用途?

比如我们升级系统,所谓的升级其实是替代以前功能中的某些方法。那么我们可以根据这个策略模式,新增新的类,然后通过类的反射机制来实现。

其中forName中的参数通过配置文件配置,从而实现创建新的实例。

b618c5633ca95fec6ddd9c53cce10b6e.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值