设计模式-设计模式入门(1)

模拟鸭子 设计原则 策略模式

Posted by SixTeen on May 19, 2016

鸭子类

方案1

现在我们需要编写绿鸭子,红鸭子,玩具鸭子,木头鸭子,并实现他们的叫方法,飞方法。这很简单,实现一个父类,所有继承它的子类都有父类的属性和方法。如下图:

yazi1

等等,这样我们每次添加一个新的鸭子都要注意是否需要重写叫方法和飞方法!因为有写鸭子不一定会叫(木头鸭子),也不一定会飞(玩具鸭子,木头样子)。

设计原则1

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

1
把会变化的部分取出来并封装起来,以便以后可以轻易的改动或者扩充此部分,而不影响不需要变化的其他部分。

既然这样,我们把会变化的(叫,飞方法)抽取出来?这样有叫方法的鸭子就实现叫动作接口,有飞方法的鸭子就实现飞动作接口,木头鸭子不会叫也不会飞,不用实现任何接口。

yazi2

这样做的话,即使我们给鸭子添加一个走方法,只需要新建一个走接口,不会走的鸭子不用实现走动作接口,看起来很不错。等等!实现接口的话,不就意味着我们有很多重复编写的代码,假设有10个会叫的鸭子,他们的叫方法只有一点点的不同,我们仍然需要实现10次!

设计原则2

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

1
所以鸭子不会负责实现接口,而是我们制造另一组动作类来实现行为接口。,鸭子的子类将使用接口所表示的行为,所以实际的实现不会绑死在鸭子的子类中。

针对接口编程,就是针对我们分离出来的叫接口,飞接口,对他们进行编程,鸭子具备叫行为和飞行为,我们将这些组合起来,通过组合来让鸭子获得具体行为。这样的好处在于,飞行叫这些动作可能也有自身的属性,而且能通过多态来执行对应的行为。最重要的是,这样飞和叫这些动作已经和鸭子没有关系,可以被其他对象复用,达到了松耦合的效果。

yazi3

类之间的关系:IS-A(是一个,继承),HAS-A(有一个,依赖),IMPLEMENTS(实现)

设计原则3

设计原则:多用组合,少用继承

1
将两个类结合起来使用,这就是组合。和继承不同的地方在于,行为不是继承来的,而是和适当的行为对象组合而来的。

策略模式

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

以鸭子类为例,我们把飞行为和叫行为当做一个算法族,每一个实现(算法)之间可以相互替换,客户(鸭子)使用的行为(算法)。我们根据鸭子(客户)的实际需要更换所使用的行为(算法)。




参考书籍:
《Head First设计模式》

1
FIN 5.20/13.56