码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2020-02-19 15:16:00      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:cas   isp   京东商城   接口   依赖   运行   size   ESS   wrapper   

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

类图

技术图片技术图片?

  • 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%");
    }
}

运行结果

技术图片

观察者模式

标签:cas   isp   京东商城   接口   依赖   运行   size   ESS   wrapper   

原文地址:https://www.cnblogs.com/camcay/p/12331024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!