本文是结合了尚硅谷韩顺平老师的设计模式后做的一些笔记和个人见解
策略模式
以鸭子的行为模式为例子
鸭子有三种行为模式:shout、swim、fly,但是不同种类的鸭子有不同的行为模式;
我们可以定义一个抽象类,定义一个抽象方法显示鸭子信息,另外三个方法定义鸭子的行为;如果实现鸭子抽象类的实现类的行为不一致,就需要重写该行为方法。 以下为代码
抽象类
3个实现类
传统的方式实现的问题分析
1) 其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的
2) 上面说的1 的问题,其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应
3) 为了改进1问题,我们可以通过覆盖fly 方法来解决 => 覆盖解决
4) 问题又来了,如果我们有一个玩具鸭子ToyDuck, 这样就需要ToyDuck去覆盖Duck的所有实现的方法 => 解决思路 策略模式 (strategy pattern)
解决方案
以下为策略模式原理图
1.定义几个行为接口(Strategy和StrategyB)并持有行为方法,可以让具体的实现类实现行为方法;
2.定义持有行为的接口,比如前面的鸭子,接口持有行为接口这个属性,然后让不同实现类(wildDuck、ToyDuck、PekingDuck)实现这个接口,并且在构造器赋予属性行为接口的具体实现类,这样可以让使用者和行为提供者解耦,并且可以通过set方法随时改变使用者的行为
以下为具体代码实现,只展示了fly这个行为,其余的行为其实都一样的
行为接口和实现类
使用者抽象类和继承类
进行测试
除此,jdk的Arrays的Comparetor也应用到了策略模式,根据不同的需求去改变排序方式