观察者模式:花与蜜蜂

1、花与蜜蜂

一朵花有Open和Close两种状态,3只蜂鸟在花Open的时候去采蜜,在花Close的时候要回巢,用面向对象技术和Design Pattern方法模拟上面过程,输出如下:

1
2
3
4
5
6
7
8
Flow Open
Hummingbird 1’s breakfast time!
Hummingbird 2’s breakfast time!
Hummingbird 3’s breakfast time!
Flow Close
Hummingbird 1’s bed time!
Hummingbird 2’s bed time!
Hummingbird 3’s bed time!

要求:

  • 1)使用一种Design Pattern方法,使花和蜜蜂之间松耦合,用你最熟悉的计算机语言写出上面完整程序;
  • 2)画出UML类图。

2、分析

  • 1、花只有一朵,但有不同状态
  • 2、蜜蜂有N只,且根据花的状态不同来通知蜜蜂实现不同的行为

    所以可以判断为明显的一对多的观察者模式

3、实现

  • 1)被观察者 - 花

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import java.util.Observable;

    public class Flower extends Observable {
    public static final String Flow_Open = "Flow Open";
    public static final String Flow_Close = "Flow Close";

    private String status;

    public String getStatus() {
    return status;
    }

    public void setStatus(String status) {
    super.setChanged();
    this.status = status;
    System.out.println(status);
    //通知所有观察者
    notifyObservers(status);
    }

    }
  • 2)观察者 - 蜜蜂

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import java.util.Observable;
    import java.util.Observer;

    public class Hummingbird implements Observer {

    private String name;

    public Hummingbird(String name) {
    // TODO Auto-generated constructor stub
    this.name = name;
    }

    @Override
    public void update(Observable observable, Object data) {
    // TODO Auto-generated method stub
    String status = data.toString();
    if (Flower.Flow_Open.equals(status)) {
    System.out.println(name + " breakfast time!");
    } else {
    System.out.println(name + " bed time!");
    }
    }

    }
  • 3)测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Test {
    public static void main(String[] args) {
    Flower flower = new Flower();

    Hummingbird hummingbird1 = new Hummingbird("Hummingbird 1’s");
    flower.addObserver(hummingbird1);

    Hummingbird hummingbird2 = new Hummingbird("Hummingbird 2’s");
    flower.addObserver(hummingbird2);

    Hummingbird hummingbird3 = new Hummingbird("Hummingbird 3’s");
    flower.addObserver(hummingbird3);

    flower.setStatus(Flower.Flow_Open);

    flower.setStatus(Flower.Flow_Close);
    }
    }