设计模式--03.观察者模式

观察者模式

观察者模式是一个消息的派发的模式,是把被观察者的状态能够及时的通知给观察者。

比如一个超市的打折了,需要把消息通知给每一个超市的顾客,这样就可以把超市作为一个被观察者,而顾客是观察者。

实现逻辑

观察者模式实现的类图如下:

观察者模式

实现步骤:

  1. 定义一个Observer接口,约束观察者(顾客)需要实现的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    public interface Observer {
    void reciveMessage(double price);
    }

    public class CusmtomerObserver1 implements Observer {
    @Override
    public void reciveMessage(double price) {

    System.out.println("CusmtomerObserver1 收到了价格消息:" + price);
    }
    }

    public class CusmtomerObserver2 implements Observer {
    @Override
    public void reciveMessage(double price) {

    System.out.println("CusmtomerObserver2 收到了价格消息:" + price);
    }
    }

  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
    25
    26
    27
    public class MarketSubject {
    private double price;
    public double getPrice() {
    return price;
    }

    public void setPrice(double price) {
    this.price = price;
    notifyObserver(price);
    }

    private ArrayList<Observer> observerList=new ArrayList<>();
    public void addObserver(Observer observer){
    observerList.add(observer);
    }

    public void removeObserver(Observer observer){
    observerList.remove(observer);
    }

    public void notifyObserver(double price){
    for (Observer ob : observerList) {
    ob.reciveMessage(price);
    }
    }
    }

  3. 实现方法的注册和通知

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class ObserverMain {
    public static void main(String[] args) {
    MarketSubject marketSubject=new MarketSubject();
    marketSubject.addObserver(new CusmtomerObserver1());
    marketSubject.addObserver(new CusmtomerObserver2());
    marketSubject.setPrice(100d);

    }
    }

    运行结果:

1
2
CusmtomerObserver1 收到了价格消息:100.0
CusmtomerObserver2 收到了价格消息:100.0
作者

付威

发布于

2020-02-05

更新于

2020-09-27

许可协议

评论