设计模式之策略模式

最近在学习设计模式,所以就将自己的感悟和分析写一下,与大家分享。我看的是Head First设计模式,所以也以其中的例子进行分析。


首先提出问题:一个模拟鸭子的游戏,鸭子有各种动作,会随着类型的不同而有不同的行为。

最初方案:首先有一父类Duck,其他的各种类型的鸭子继承父类的方法和属性。如下图:

设计模式之策略模式_第1张图片设计模式之策略模式_第2张图片

这样子类就继承父类的方法,但是如果现在鸭子想飞行的话,我们会在Duck类中加入方法fly(),如右上图。但是这时就出现问题了,不是所有的鸭子都会飞。如果为了解决这个弊端去子类中覆盖父类的fly()方法,那么会出现另一个问题:当涉及“维护”时,为了“复用”目的而使用继承,结果并不完美。

到此出现的问题有一下几个:

一、代码在子类中重复。

二、运行时的行为不容易改变。

三、改变父类会牵一发动全身,造成某些子类并不需要的改变。

如果我们在这里用接口实现,同样会重复过多的代码。所以我们需要改变方向了。


解决方案:将飞行和叫的动作“委托”给别人处理,而不是定义在Duck类(或者子类)中的叫和飞行的方法。

我们在Duck类中添加“两个实例变量”,即flyBehavior和quackBehavior,声明为接口类型,而不是具体类的实现类型,这样Duck中的flyBehavior和quackBehavior可以动态的设定,每个鸭子对象都会动态的设定这些变量以在运行时引用正确的行为类型。

设计模式之策略模式_第3张图片

经过上面的分析,我们可以得到设计模式我们需要遵循原则几个原则:

第一条设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

第二条设计原则:针对接口编程,而不是针对实现编程。

第三条设计原则:多用组合,少用继承。

这就是策略模式:

策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

你可能感兴趣的:(设计模式,面向对象编程)