观察者模式
Posted chen-ying
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。
一、观察者模式
观察者模式又叫发布-订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时会通知所有的观察者对象,使它们能够自动地更新自己。当一个对象的改变需要改变其他的对象的时候就可以用观察者模式。
二、结构图
Subject类是抽象的主题对象,也是抽象通知者,可以从Observer观察者对象引用的聚集里面添加或者删除;
Observer类是抽象观察者,在得到主题的通知时更新自己。
三、示例
import java.util.ArrayList; import java.util.List; //抽象通知者 abstract class Subject List<Observer> observers=new ArrayList<>(); //增加观察者 protected void attach(Observer observer) observers.add(observer); //移除观察者 protected void detach(Observer observer) observers.remove(observer); //进行通知 protected void notifying() for (Observer o :observers) o.update(); //抽象观察者 abstract class Observer abstract void update(); //具体通知者,将有关状态存入具体观察者对象, // 在具体主题的内部状态改变时,给所有登记过的观察者发出通知。 class ConcreteSubject extends Subject private String subjectState; //具体被观察者状态 public String getSubjectState() return subjectState; public void setSubjectState(String subjectState) this.subjectState = subjectState; //具体观察者 class ConcreteObserver extends Observer private String name; private String observerState; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject,String name) this.subject=subject; this.name=name; @Override void update() observerState=subject.getSubjectState(); System.out.println("观察者"+name+"的状态:"+observerState); public class ObserverPattern public static void main(String[] args) ConcreteSubject s=new ConcreteSubject(); s.attach(new ConcreteObserver(s,"one")); s.attach(new ConcreteObserver(s,"two")); s.attach(new ConcreteObserver(s,"three")); s.setSubjectState("ABC"); s.notifying();
输出结果:
四、观察者模式的不足
可以从上面的梳理中发现一些问题,
首先,抽象的观察者和抽象的通知者还是耦合的,那如果缺少通知者或者观察者的抽象类,那就无法完成工作了呀;
另外,观察者可能不一定是是更新状态这些抽象类中统一的操作,可能还会进行一些其他的操作,
这些是需要改进的问题。
以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章