文章目录

寒假带着《head first设计模式》这本厚厚的书准备系统的学习一下设计模式。不同于以往枯燥的讲解知识点,Head first以幽默通俗易懂的形式将知识呈现在读者面前。以前也看过设计模式的其它一些书籍,虽然讲解全面,却不好理解,且一味的讲解知识点容易让人犯困。看了《head first 设计模式》前面一部分,其特有的讲解模式让我印象深刻,容易理解。本文还将OO的设计原则贯穿于设计模式的讲解中,让人更深刻的把握OO设计原则和设计模式的精髓。

书上观察者模式的定义如下:

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


本文引用书上的例子。有各种各样的鸭子,不同的鸭子行为可能不一样,叫声不一样、飞行行为不一样、外观不一样等等。
鸭子的主体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;

public Duck() {
}

public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}

public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}

abstract void display();

public void performFly() {
flyBehavior.fly();
}

public void performQuack() {
quackBehavior.quack();
}

public void swim() {
System.out.println("All ducks float, even decoys!");
}
}

Duck中包含两个实例变量“flyBehavior”与“quackBehavior”,声明为接口类型,每个鸭子对象都会动态的设置这些变量以在运行时引用正确的行为类型(如:FlyWithWings,Quack等)。
鸭子行为的接口:

1
2
3
4
5
6
public interface FlyBehavior {
public void fly();
}
public interface QuackBehavior {
public void quack();
}

鸭子行为的实现:

1
2
3
4
5
6
7
8
9
10
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I'm flying!!");
}
}
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}

具体鸭子的实现:

1
2
3
4
5
6
7
8
9
10
11
public class RedHeadDuck extends Duck {

public RedHeadDuck() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}

public void display() {
System.out.println("I'm a real Red Headed duck");
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MiniDuckSimulator {

public static void main(String[] args) {

MallardDuck mallard = new MallardDuck();
RubberDuck rubberDuckie = new RubberDuck();
DecoyDuck decoy = new DecoyDuck();

ModelDuck model = new ModelDuck();

mallard.performQuack();
rubberDuckie.performQuack();
decoy.performQuack();

model.performFly();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}

文章目录