设计模式之观察者模式
2017-10-30 20:27
176 查看
观察者模式又叫做发布-订阅(Publish/Subscribe)模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察对象,使它们能够更新自己。
Subject类、可翻译为主题或通知者,一般用一个抽象类或者接口实现。它把所有对观察着对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者。
Observer类,抽象观察者,为所有的具体观察者定义一个更新方法(抽象方法,由具体观察者自己去实现)
ConcreteSubject类,叫做具体主题或者具体通知者,将有关状态存入具体观察者对象;在具体的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新方法,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。
main 函数代码
运行结果:
观察者X检测到主题的状态是Running
观察者Y检测到主题的状态是Running
观察者Z检测到主题的状态是Running
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察对象,使它们能够更新自己。
Subject类、可翻译为主题或通知者,一般用一个抽象类或者接口实现。它把所有对观察着对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者。
public abstract class Subject { private ArrayList<Observer> observers=new ArrayList<Observer>(); //增加观察者 public void Attach(Observer observer) { observers.add(observer); } //移除观察者 public void Detch(Observer observer) { observers.remove(observer); } //通知 public void Notify() { for(Observer observer:observers) { observer.Update(); } } }
Observer类,抽象观察者,为所有的具体观察者定义一个更新方法(抽象方法,由具体观察者自己去实现)
public abstract class Observer { public abstract void Update(); }
ConcreteSubject类,叫做具体主题或者具体通知者,将有关状态存入具体观察者对象;在具体的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
public class ConcreteSubject extends Subject{ private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } }
ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新方法,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。
public 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 public void Update() { observerState=subject.getSubjectState(); System.out.println("观察者"+name+"检测到主题的状态是"+observerState); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } }
main 函数代码
public static void main(String[] args) { ConcreteSubject s=new ConcreteSubject(); ConcreteObserver X=new ConcreteObserver(s, "X"); ConcreteObserver Y=new ConcreteObserver(s, "Y"); ConcreteObserver Z=new ConcreteObserver(s, "Z"); s.Attach(X); s.Attach(Y); s.Attach(Z); s.setSubjectState("Running"); s.Notify(); }
运行结果:
观察者X检测到主题的状态是Running
观察者Y检测到主题的状态是Running
观察者Z检测到主题的状态是Running
相关文章推荐
- 设计模式之观察者模式 Observer
- HeadFirst 设计模式-观察者模式
- 设计模式—观察者模式(十)
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- PHP 设计模式之观察者模式
- 26种设计模式之观察者模式
- 【设计模式】观察者模式
- Java设计模式-- 观察者模式
- 设计模式--观察者模式
- Java常用类库——观察者设计模式(Observer接口、Observable类)
- 设计模式(六)----观察者模式
- 安卓设计模式之观察者模式
- 23种设计模式之观察者模式
- 设计模式--观察者模式
- iOS设计模式:观察者
- 设计模式之观察者模式
- 【JS 设计模式 】观察者模式之实时改变页面中的金额数
- iOS 观察者设计模式
- 设计模式之观察者模式
- 设计模式示例四 Observer(观察者)和Iterator(迭代器)