您的位置:首页 > 其它

面向对象设计模式之---观察者模式(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具体课题的影响。一个具体的观察者类只关注一个具体的课题。

举个例子吧,比如股票涨跌这个课题,每一支股票肯定有很多人关注,这些人就是这支股票的观察者,假设有一天股票涨了,从某个层面上就通知了那些所有的观察者说股票可以卖出了。我们不妨把这个例子转变为代码:

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();
}
}


运行结果为:



显然,观察者模式的工作是在解除耦合,让双方都依赖抽象,而不是具体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息