Referenced by Head First Design Pattern
设计模式,主要是为了让代码更具弹性。
原始的模拟鸭子游戏:
使用标准的OO技术,设计一个鸭子超类,并让各种鸭子继承此超类:
现在需要添加一个fly()的功能,最简单的做法是在超类中添加fly()方法,但是并不是所有的子类都需要这个方法。
因此这种设计有几个缺陷:
1. 增加一个新的鸭子(比如橡皮鸭子),需要检查已知的每个功能是否需要拥有。
2. 增加一个新的功能,需要检查每种鸭子是否需要拥有这个功能,即牵一发而动全身。
3. 最大的问题,同一个功能对不同的鸭子可能有多种变化,比如每种鸭子飞行的方式不同,叫的声音也不同。
4. 运行时的行为不容易改变。而且容易造成代码复用。
设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
鸭子的子类使用接口所表示的行为,所以实现的"实际"不会被绑定死在鸭子的子类中。(换句话说,特定的具体行为编写在实现了FlyBehavior与QuackBehavior的类中)
Duck超类的实现方式:
public abstract class Duck {
FlyBehavior flyBehavior;//飞行行为的对象
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();
public void swim() {
System.out.println("All ducks float, even decoys!");
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;//动态改变飞行行为
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
public void performFly() {
flyBehavior.fly();//委托给行为类处理
}
实现飞行行为的接口:
public interface FlyBehavior {
public void fly();
}
具体实现飞行方式的行为类:
public class FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("I'm flying");
}
}
具体某种Duck的类:
public class MallardDuck extends Duck{
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
这样,就可以使用:
Duck mallard = new MallardDuck();
mallard.setFlyBehavior(new FlyNoWay());
来创建真正的对象了。并可以动态改变行为。
策略模式(Strategy Pattern):定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
共享模式词汇的威力:
1.共享的模式词汇"威力强大"
2.模式能够让你用更少的词汇做更充分的沟通
3.将说话的方式保持在模式层次,可让你待在“设计圈子”久一点
4.共享词汇可帮你的开发团队快速充电
5.共享词汇能帮助初级开发人员迅速成长