设计模式之策略模式

目录

 

策略模式介绍

鸭子事例

简单的鸭子

会飞的鸭子

橡皮鸭登场

噩梦开始

策略模式鸭子


策略模式介绍

策略模式就是将功能定义为算法簇,分别封装起来,让他们之间可以替换,此模式可以让算法的变化独立于使用算法的客户。

 

鸭子事例

我们通过一个事例的发展来理解策略模式的好处(该事例来源于《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)添加新的能力。

你可能感兴趣的:(设计模式)