您的位置:首页 > 其它

设计模式-观察者模式Observer

2016-04-13 16:43 375 查看
观察者模式(Observer),又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。



实现代码:

Subject类,主题类或抽象通知者类,一般用一个抽象类或接口实现,他把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

package observer.demo;

/*

 * 主题类或抽象通知者类,一般用一个抽象类或接口实现,他把所有对观察者对象的引用保存在一个聚集里,

 * 每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

 * */

import java.util.ArrayList;

public abstract class Subject {
private ArrayList<Observer> observers = new ArrayList<Observer>();
//增加观察者
public void attach(Observer observer){
observers.add(observer);
}
//移除观察者
public void detach(Observer observer){
observers.add(observer);
}
//通知
public void notifyObs(){
for(Observer obs:observers){
obs.update();
}
}

}

/*

 * 抽象观察者,为所有的具体观察者定义一个接口,在得到主题通知时更新自己,这个接口叫做抽象接口,抽象观察者一般用一个抽象类或者一个接口实现,

 * 更新接口通常包含一个update方法,这个方法叫更新方法*/

public abstract class Observer {
public abstract void update();

}

/*

 * 具体主题或者具体通知者,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。

 * */

public class ConcreteSubject extends Subject {
private String subjectState;

public String getSubjectState() {
return subjectState;
}

public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
//客户端代码
public static void main(String[] args){
ConcreteSubject mConcreteSubject = new ConcreteSubject();
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"AAA"));
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"BBB"));
mConcreteSubject.attach(new ConcreteObserver(mConcreteSubject,"CCC"));
mConcreteSubject.setSubjectState("状态不错哦!");
mConcreteSubject.notifyObs();
}

}

/*

 * 具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态和主题的状态相协调,具体观察者角色可以保存一个指向具体主题对象的引用。

 * */

public class ConcreteObserver extends Observer
c94b
{
private String name;
private String observerState;
private ConcreteSubject subject;

public ConcreteObserver(ConcreteSubject subject,String name){
this.name = name;
this.subject = subject;
}

public ConcreteSubject getSubject() {
return subject;
}

public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}

@Override
public void update() {
observerState = subject.getSubjectState();
System.out.println("观察者 "+name+" 的新状态 "+observerState);
}

}

那么为什么要使用观察者模式?将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护,扩展和重用带来不便。而观察者模式的关键对象是主题subject和观察者observer,一个subject可以有任意数量的依赖他的observer,一旦subject的状态发生变化,所有的observer都可以得到通知。subject发出通知时,并不需要知道谁是他的观察者observer,也就是说,具体观察者是谁,他根本就不需要知道。而任何一个具体的观察者,也不需要知道其他观察者的存在。

什么时候应该使用观察者模式?就是当一个对象的改变需要同时改变其他对象的时候。而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。

观察者模式所要做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: