策略模式
定义:策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于算法的客户。
如上图,我们在开发一个Duck类时候,想要实现不同的鸭子类,如绿头鸭,飞鸭,还有橡皮鸭等,这些鸭子各有各的行为,也有共同的行为。比如许多种鸭子都会叫,有的会飞,有的不会,而不同的鸭子叫的声音也可能不一样。如果我们在超类Duck类中定义fly()或者bark()方法,若存在许多子类时,都需要重新实现这些方法。可以想到需要重写这些方法很多遍。所以应该减少这些方法的实现,不然程序在以后的维护和扩展时,需要修改大量的代码。
如果采用上图的策略模式,将鸭子的行为想成一族算法,算法代表鸭子能做的事情,对每个算法(即鸭子的行为)用一个接口来描述行为(如叫),而对不同的叫声,我们使用不同类来实现这个接口。这样不管以后需要增加什么样的声音只需要增加一个类来实现这个接口就可以了,而不用修改别的代码。当然,我们需要再超类Duck类中定义一个对应的接口变量(组合的思想)。例如我们为飞行行为定义了Flybehavior接口(内声明一个fly()),每个实现该接口的类都重写了自己特定的fly()方法。
Flybehavior flyBehavior;
由于duck的子类都继承了flyBehavior变量,所以子类可以方便的利用flyBehavior变量调用不同的fly方法。只需将不同的实现该接口的类对象赋值给flyBehavior变量即可。flyBehavior.fly()就可以调用相应对象的fly()方法。
但是我们如何在程序执行过程中,动态的改变鸭子的行为呢。
我们可以通过这样实现:
首先在,duck类中加入2个新方法:
public void setFlyBehavior(FlyBehavior fb){
flyBehavior=fb;
}
public void performFly(){
flyBehavior.fly();
通过这样我们只需使用duck类的实例,对flyBehavior变量赋一不同的接口实现类,就可以通过performFly()实现不同的行为。