观察者模式

定义:定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。

类图

  • Subject:所有具体主题的公共接口,包含注册观察者(订阅),移除观察者(取消订阅),通知观察者(消息更新)
  • ConcreteSubject:具体的主题,可以通过setState设置状态变化调用notifyObservers通知观察者
  • Observer:观察者接口,所有观察者都要实现,只有一个update()方法
  • ConcreteObserver:具体的观察者

代码示例

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

public class LogitechSupplier implements Subject { Vector<Observer> observers; String message; public LogitechSupplier(){ observers = new Vector<>(); } @Override public void registerObserver(Observer observer) { observers.addElement(observer); } @Override public void removeObserver(Observer observer) { observers.removeElement(observer); } @Override public void notifyObservers() { for(Observer observer:observers){ observer.update(message); } } public void messageChanged(String message){ this.message=message; notifyObservers(); } } public interface Observer { void update(Object args); } public class TBShop implements Observer { Subject subject; public TBShop(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(Object args) { System.out.println("天猫商城收到消息:"+args); } } public class JDShop implements Observer { Subject subject;//通过持有主题,可以从主题拉取数据 public JDShop(Subject subject){ this.subject=subject; subject.registerObserver(this); } @Override public void update(Object args) { System.out.println("京东商城收到消息:"+args); } }

 

测试

public class ObserverPatternTestDemo {
    public static void main(String args[]){
        //获取主题
        LogitechSupplier logitechSupplier = new LogitechSupplier();
        //观察者注册
        Observer jdShop = new JDShop(logitechSupplier);
        Observer tbShop = new TBShop(logitechSupplier);
        //主题向观察者推送消息
        logitechSupplier.messageChanged("新鼠标到货了!");
        logitechSupplier.messageChanged("机械键盘降价10%");
    }
}

运行结果

posted @ 2020-02-19 13:55  Camcay  阅读(109)  评论(0)    收藏  举报