您的位置:首页 > 其它

设计模式之观察者模式

2017-10-30 20:27 176 查看
观察者模式又叫做发布-订阅(Publish/Subscribe)模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察对象,使它们能够更新自己。



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: