代码改变世界

Head First 设计模式之入门

2012-11-17 15:47  ...平..淡...  阅读(185)  评论(0编辑  收藏  举报

开启自己的设计模式学习。先来用一个老套的鸭子的例子做介绍,来初涉设计模式领域。

Duck具有功能:

但继承Duck类的子类在fly和quack方法上,会有改变。

修改后,最终效果为:

 

设计原则:

(1)从基类找出应用中可能需要变化之处,把它们独立出来,不要把它们和不需要变化的代码混在一起。 (把这些需要改变的行为用分别创建接口来表示)

(2)针对接口编程,而不是针对实现编程。    (创建子类实现接口,将具体实现放在这些子类中;而不是直接定义在Duck类中,或者Duck的子类中)

一、分析:

"针对接口编程"真正含义是"针对超类型编程"。针对接口编程,关键在于多态。

例子:    针对实现编程:Dog d = new Dog(); d.bark();  //变量d为Dog类型,会造成我们必须针对具体实现编程。

          针对接口编程:Animal animal = new Dog(); animal.makeSound();  //我们知道对象是Dog,但我们现在利用animal进行多态的调用。

我们不需要知道实际的子类型是什么,我们只关心他知道如何正确地进行makeSound就行了。

 

二、比较

以前的做法是:行为来自Duck超类的具体实现;或者是继承某个接口并由子类自己实现。 这两种做法都是依赖于"实现"。

新的设计方法:Duck的子类使用接口(FlyBehavior/QuackBehavior)所表示的行为。所以实际的"实现"不会被绑定在子类中。
换句话说,特定的行为编写在实现了FlyBehavior/QuackBehavior的类中。

 

(3)favor composition over inheritance.(多用组合,少用继承)

(4)为了交互对象之间的松耦合设计而努力