面向对象设计模式之---观察者模式(Observer Pattern)
2018-03-29 10:28
621 查看
今天更新的设计模式是观察者模式。刚才稍微去看了一眼Web前端开发,很炫!很炫!
对于这个观察者模式,我就直接开门见山地直接放出定义和UML类图,后面再解释。
观察者模式的定义如下:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 ——《大话设计模式》
UML类图如下:
首先看到的是一个叫Subject的抽象类,这个Subject类可以解释为抽象的课题类,里面有一个Attach和Detach抽象方法,这意味着一个课题可以有多个观察者来观察,可以加入,可以退出。然后有一个Notify通知方法,当这个课题的状态发生变化的时候,逐一通知所有的观察者。接下来就是抽象的Observer类,也就是观察者类,里面只有一个抽象的Update的方法,这个方法就是被Subject类所调用,在通知的时候观察者做出响应的方法。再接下来就是继承Subject的ConcentrateSubject类和继承Observer的ConcentrateObserver类,ConcentrateSubject类的SubjectState属性规定了课题的状态,一旦这个状态被改变,将会影响所有的观察者。至于ConcrateObserver类中的observerState,规定了观察者的状态,受ConcentrateSubject具体课题的影响。一个具体的观察者类只关注一个具体的课题。
举个例子吧,比如股票涨跌这个课题,每一支股票肯定有很多人关注,这些人就是这支股票的观察者,假设有一天股票涨了,从某个层面上就通知了那些所有的观察者说股票可以卖出了。我们不妨把这个例子转变为代码:
运行结果为:
显然,观察者模式的工作是在解除耦合,让双方都依赖抽象,而不是具体。
对于这个观察者模式,我就直接开门见山地直接放出定义和UML类图,后面再解释。
观察者模式的定义如下:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 ——《大话设计模式》
UML类图如下:
首先看到的是一个叫Subject的抽象类,这个Subject类可以解释为抽象的课题类,里面有一个Attach和Detach抽象方法,这意味着一个课题可以有多个观察者来观察,可以加入,可以退出。然后有一个Notify通知方法,当这个课题的状态发生变化的时候,逐一通知所有的观察者。接下来就是抽象的Observer类,也就是观察者类,里面只有一个抽象的Update的方法,这个方法就是被Subject类所调用,在通知的时候观察者做出响应的方法。再接下来就是继承Subject的ConcentrateSubject类和继承Observer的ConcentrateObserver类,ConcentrateSubject类的SubjectState属性规定了课题的状态,一旦这个状态被改变,将会影响所有的观察者。至于ConcrateObserver类中的observerState,规定了观察者的状态,受ConcentrateSubject具体课题的影响。一个具体的观察者类只关注一个具体的课题。
举个例子吧,比如股票涨跌这个课题,每一支股票肯定有很多人关注,这些人就是这支股票的观察者,假设有一天股票涨了,从某个层面上就通知了那些所有的观察者说股票可以卖出了。我们不妨把这个例子转变为代码:
import java.util.*; //抽象的观察者 abstract class Subject { //观察者列表 protected ArrayList<Observer> oblist = new ArrayList<Observer>(); //添加观察者 public void Attach(Observer o) { oblist.add(o); } //移除观察者 public void Detach(Observer o) { oblist.remove(o); } //通知观察者 public void Notify() { for(int i = 0 ; i < oblist.size() ; i++) { oblist.get(i).Update(); } } } //抽象的观察者 abstract class Observer {; //对通知做出响应 public abstract void Update(); } //股票课题 class Stock extends Subject { //具体课题状态 private String subjectState; public void setSubjectState(String state) { this.subjectState = state; } public String getSubjectState() { return this.subjectState; } } //具体的观察者 具体的观察者观察一个具体课题 class Watcher extends Observer { private String observerState; //Subject用以更新observerState private Stock subject; private String name; public Watcher(String name , Stock sub) { this.name = name; this.subject = sub; } public void Update() { //观察者的state与课题的state相关联 this.observerState = subject.getSubjectState(); System.out.println(this.name+" notified! State is " + this.observerState); } } public class Main { public static void main(String args[]) { Stock s = new Stock(); s.Attach(new Watcher("股民A",s)); s.Attach(new Watcher("股民B",s)); s.setSubjectState("股票涨了!"); s.Notify(); } }
运行结果为:
显然,观察者模式的工作是在解除耦合,让双方都依赖抽象,而不是具体。
相关文章推荐
- C#面向对象模式设计第十九讲:Observer 观察者模式(行为型模式)
- [导入]C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式.zip(10.27 MB)
- 面向对象设计模式--观察者模式(Observer)
- 设计模式【观察者模式Observer Pattern】
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
- 对象行为型模式——观察者模式(Observer Pattern)
- 设计模式(17)——观察者模式(Observer Pattern)
- 设计模式笔记——(三:观察者模式 Observer Pattern)
- 观察者设计模式(Observer Pattern)
- C#设计模式——观察者模式(Observer Pattern)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 设计模式17:Observer Pattern (观察者模式)
- 设计模式原来如此-观察者模式(Observer Pattern)
- 设计模式——观察者模式(Observer Pattern)
- 设计模式-观察者模式(Observer Pattern)
- C#设计模式之十六观察者模式(Observer Pattern)【行为型】
- 【设计模式】观察者模式 Observer Pattern
- C#设计模式(17)——观察者模式(Observer Pattern)
- PHP面向对象深入理解之四(设计模式-观察者模式)
- 【设计模式】设计模式C++编程实现之观察者模式(ObserverPattern)