设计模式之策略模式
Posted xiaojimanman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之策略模式相关的知识,希望对你有一定的参考价值。
目录
策略模式介绍
策略模式就是将功能定义为算法簇,分别封装起来,让他们之间可以替换,此模式可以让算法的变化独立于使用算法的客户。
鸭子事例
我们通过一个事例的发展来理解策略模式的好处(该事例来源于《Head First》)
简单的鸭子
对于鸭子,最初只定义一个鸭子的超类,所有的鸭子都会呱呱叫(quack),也会游泳(swim),对于鸭子的外观分别有其子类去实现,类图如下:
会飞的鸭子
随着业务的发展,需要给鸭子加上飞行的技能,因此需要给超类添加飞行(fly)技能,类图如下:
橡皮鸭登场
突然有一天,需要添加一个橡皮鸭,,但是橡皮鸭不会呱呱叫(quack),也不会飞(fly),因此我们需要对其进行覆盖,类图如下:
噩梦开始
对于这种继承的形式,每当有一种新鸭子出现时,就需要被迫检查超类中的方法,确认是否需要将其进行覆盖,无穷无尽的噩梦。
对于这种,是否可以将呱呱叫(quack)和飞行(fly)定义为接口,每种鸭子去实现对应的接口呢,基于这种思考,设计如下类图:
策略模式鸭子
对于上述用接口实现的鸭子好像解决了类继承的噩梦,但是接口不具有实现代码,所有继承接口无法达到代码的复用,也就意味着你修改某个行为,要将所有子类中的行为都做相关的修改,这又是另一个噩梦的开始,而策略模式就很好的解决了这两个噩梦。
首先我们将鸭子变化的行为呱呱叫(quack)和飞行(fly)抽取出来,组成一个算法簇,然后为不同的鸭子赋予不同的行为能力,具体类图如下:
对于performFly和performQuack的实现如下:
public void performFly()
flyBehavior.fly();
public void performQuack()
quackBehavior.quack();
对于每种鸭子,我们可以在其构造方法中给其指定默认的呱呱叫(QuackBehavior)和飞行(FlyBehavior)能力,如果需要对其能力进行变更,通过setQuackBehavior(QuackBehavior quackBehavior)对其呱呱叫或setFlyBehavior(FlyBehavior flyBehavior)对其飞行能力进行变更,如果后续又有新的呱呱叫(QuackBehavior)或飞行(FlyBehavior)能力,在新添加一个呱呱叫(QuackBehavior)或飞行(FlyBehavior)能力,需要该能力的鸭子直接通过构造方法或setQuackBehavior(QuackBehavior quackBehavior)、setFlyBehavior(FlyBehavior flyBehavior)添加新的能力。
以上是关于设计模式之策略模式的主要内容,如果未能解决你的问题,请参考以下文章