文章说明
- 该文章为
《Head First 设计模式》
的学习笔记 - 非常推荐大家去买一本
《Head First 设计模式》
去看看,节奏轻松愉悦,讲得通俗易懂,非常适合想要学习、了解、应用设计模式以及OO1设计原则的小白。
提出问题
- Joe做了一款模拟鸭子的游戏:SimDuck
- 游戏中会出现各种的鸭子,一边游水戏水,一边呱呱叫。(此系统内部设计使用了标准的OO1技术,设计了一个鸭子超类,并让各种鸭子继承此超类)
- 假如接下来模拟程序需要会飞的鸭子,不同叫法的鸭子。
- 怎么样的设计才能建立可复用性,可扩展性,可维护性的系统呢?
模式的定义
定义了算法蔟,分别封装起来,让他们之间互相替换,此模型让算法的变化独立于使用算法的客户。
涉及的OO1设计原则
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
类图
代码的部分展示
名为鸭子的抽象父类 Duck
:
public abstract class Duck {
// 代理实现Duck的飞行和叫声行为
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
Duck() {}
public abstract void display();
// 不需要覆盖重写
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
// 提供动态设置鸭子行为的功能:
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
鸭子叫和飞的行为委托给接口 FlyBehavior
QuackBehavior
的实现类去执行:
public interface FlyBehavior {
void fly();
}
-------------------------------
public interface QuackBehavior {
void quack();
}