3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。你不希望这些对象是紧密耦合的。
类图:
例子:
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:被观察者的状态发送了变化