Skip to content

Latest commit

 

History

History
70 lines (53 loc) · 2.61 KB

File metadata and controls

70 lines (53 loc) · 2.61 KB

本文来自廖雪峰,郎涯进行简单排版与补充

观察者模式,即Observer又称发布-订阅模式,是一种一对多的通知机制,使得双方无需关心对方,只关心通知本身。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

假设一个电商网站,有多种Product(商品),同时,Customer(消费者)和Admin(管理员)对商品上架、价格改变都感兴趣,希望能第一时间获得通知。于是,Store(商场)可以这么写:

引用一个ProductObserver接口,任何人想要观察Store,只要实现该接口,并且把自己注册到Store即可:

public class Store {
    private List<ProductObserver> observers = new ArrayList<>();
    private Map<String, Product> products = new HashMap<>();

    // 注册观察者:
    public void addObserver(ProductObserver observer) {
        this.observers.add(observer);
    }

    // 取消注册:
    public void removeObserver(ProductObserver observer) {
        this.observers.remove(observer);
    }

    public void addNewProduct(String name, double price) {
        Product p = new Product(name, price);
        products.put(p.getName(), p);
        
        // 通知观察者:
        observers.forEach(o -> o.onPublished(p));
    }

    public void setProductPrice(String name, double price) {
        Product p = products.get(name);
        p.setPrice(price);
        
        // 通知观察者:
        observers.forEach(o -> o.onPriceChanged(p));
    }
}
// observer:
Admin a = new Admin();
Customer c = new Customer();

// store:
Store store = new Store();

// 注册观察者:
store.addObserver(a);
store.addObserver(c);
┌─────────┐      ┌───────────────┐
│  Store  │─ ─ ─>│ProductObserver│
└─────────┘      └───────────────┘
     │                   ▲
                         │
     │             ┌─────┴─────┐
     ▼             │           │
┌─────────┐   ┌─────────┐ ┌─────────┐
│ Product │   │  Admin  │ │Customer │ ...
└─────────┘   └─────────┘ └─────────┘

有的童鞋可能发现Java标准库有个java.util.Observable类和一个Observer接口,用来帮助我们实现观察者模式。但是,这个类非常不!好!用!实现观察者模式的时候,也不推荐借助这两个东东。