首页 > 其他 > 详细

【设计模式】9.观察者模式

时间:2020-05-04 22:18:09      阅读:74      评论:0      收藏:0      [点我收藏+]

观察者模式

  观察者(Observer)模式,又叫发布/订阅(Publish/Subscribe)模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够更新自己。适用于当一个对象的改变需要同时改变其他对象时情形。

 

结构图:

技术分享图片

 

Subject:主题(抽象通知者)保存多个观察者,可增加和删除观察者。

Observer:抽象观察者,得到主题(抽象通知者)的通知时更新自己,提供更新接口

ConcreteSubject:具体主题(具体通知者),具体主题内部改变时,通知所有注册过的观察者。

ConcreteObserver:具体观察者,实现更新接口,接收具体主题(具体通知者)的通知。

 

其中主题不知道谁是观察者,每个观察者也不知道有其他观察者的存在。

例:

public abstract class Subject {
    private List<Observer> list = new ArrayList<>();   // 保存观察者

    public boolean add(Observer observer){  // 增加观察者
        if (observer != null) {
            list.add(observer);
            return true;
        }
        return false;
    }

    public boolean remove(Observer observer){  // 移除观察者
        if (observer != null) {
            list.remove(observer);
            return true;
        }
        return false;
    }

    public void notifyObservers(){           // 通知所有观察者
        for (Observer observer : list) {
            observer.update();
        }
    }
}

 

public class ConcreteSubject extends Subject {
    private String subject_state;     // 主题自身状态

    public String getSubject_state() {
        return subject_state;
    }

    public void setSubject_state(String subject_state) {
        this.subject_state = subject_state;
    }
}

 

public abstract class Observer {
    public abstract void update();  // 更新状态接口
}

 

public class ConcreteObserver extends Observer{
    private String name;
    private String observer_state;    // 观察者的状态
    private ConcreteSubject subject;  // 观察的主题

    public ConcreteObserver(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
    }

    @Override
    public void update() {          // 实现更新接口
        observer_state = subject.getSubject_state();
    }

    public String getObserver_state() {
        return observer_state;
    }
}

 

public class Test {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();  // 具体主题

        ConcreteObserver observer1 = new ConcreteObserver("jzx",subject); // 观察者1
        ConcreteObserver observer2 = new ConcreteObserver("zzh",subject); // 观察者2
        subject.add(observer1);  // 具体主题注册观察者1
        subject.add(observer2);  // 具体主题注册观察者2

        subject.setSubject_state("发布");   // 主题改变自身状态
        subject.notifyObservers();          // 主题发布通知
        System.out.println(observer1.getObserver_state());  // 查看观察者1目前状态
        System.out.println(observer2.getObserver_state());  // 查看观察者2目前状态

        subject.remove(observer2);         // 主题决定不通知observer2
        subject.setSubject_state("下架");  // 主题改变自身状态
        subject.notifyObservers();         // 主题发布通知
        System.out.println(observer1.getObserver_state());  // 查看观察者1目前状态
        System.out.println(observer2.getObserver_state());  // 查看观察者2目前状态
    }
}

 

输出:

发布

发布

下架

发布

 

【设计模式】9.观察者模式

原文:https://www.cnblogs.com/jiazhongxin/p/12828488.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!