爱编程
Observer观察者模式
2015-3-27 Jessie
定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。



观察者模式的组成部分:

1、抽象目标角色(Subject):也就是抽象的被观察者,被观察者知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。被观察者通常是抽象类或者接口。

2、抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要是抽象类或者接口。

3、具体的目标角色(Concrete Subject):将有关状态存入各个具体观察者对象,当它的状态发生改变时,向它的各个观察者发出通知。

4、具体观察者角色(Concrete Observer):存储有关状态,这些状态应该与目标的状态保持一致。实现Observer的更新接口使自己的状态与被观察者的状态一致。在这个角色内可以维护指向被观察者对象的引用。



适用性:

在以下任一情况下可以使用观察者模式:

1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使它们可以各自独立的改变和复用。

2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个其它对象。


3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。你不希望这些对象是紧密耦合的。







类图:



QQ图片1.png



例子:






package yz.observer;
/**
* 抽象观察者
* @包名 yz.observer
* @文件名 Observer.java
* @作者 yz
* @创建日期 2015-3-27
*/
public abstract class Observer {
public abstract void update();
}















package yz.observer;

import java.util.ArrayList;
import java.util.List;

/**
* 抽象被观察者
*
* @包名 yz.observer
* @文件名 Subject.java
* @作者 yz
* @创建日期 2015-3-27
*/
public abstract class Subject {
public List<Observer> observer=new ArrayList<Observer>();
public String state;

public void attach(Observer obj) {
observer.add(obj);
}

public void detach(Observer obj) {
observer.remove(obj);
}

public void myNotify() {
for(Observer temp:observer){
temp.update();
}
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}



}









package yz.observer;
/**
* 具体被观察者
* @包名 yz.observer
* @文件名 SubjectImpl.java
* @作者 yz
* @创建日期 2015-3-27
*/
public class ConcreteSubject extends Subject{

}





package yz.observer;
/**
* 具体观察者
* @包名 yz.observer
* @文件名 ObserverImpl.java
* @作者 yz
* @创建日期 2015-3-27
*/
public class ConcreteObserver extends Observer{
public Subject subject;
public String arg;

public ConcreteObserver(Subject subject,String arg) {
this.arg=arg;
this.subject=subject;
}

@Override
public void update() {
System.out.println(arg+":"+subject.getState());

}

}

package yz.observer;
/**
* 测试
* @包名 yz.observer
* @文件名 Test.java
* @作者 yz
* @创建日期 2015-3-27
*/
public class Test {
public static void main(String[] args) {
Subject s=new ConcreteSubject();
s.attach(new ConcreteObserver(s,"观察者A"));
s.attach(new ConcreteObserver(s,"观察者B"));
s.attach(new ConcreteObserver(s,"观察者C"));
s.setState("被观察者的状态发送了变化");
s.myNotify();
}
}










执行输出:



观察者A:被观察者的状态发送了变化

观察者B:被观察者的状态发送了变化

观察者C:被观察者的状态发送了变化