行为型设计模式--观察者模式(Observer)

观察者模式(Observer)

 

    观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。


    Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

 

行为型设计模式--观察者模式(Observer)

 

    Observer模式的角色:


    抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;

 

    具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;

 

    抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;

 

    具体观察者(ConcreteObserver)角色: 保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。

 

abstract class Subject {
	private List<Observer> observers = new ArrayList<Observer>();

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

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

	public void Notify() {
		for (Observer o : observers) {
			o.update();
		}
	}
}

class ConcreteSubject extends Subject {
	private String subjectState;

	public String getSubjectState() {
		return subjectState;
	}

	public void setSubjectState(String subjectState) {
		this.subjectState = subjectState;
	}
}

interface Observer {
	public void update();
}

class ConcreteObserver implements Observer {
	private String name;
	private String observerState;
	private ConcreteSubject subject;

	public ConcreteSubject getSubject() {
		return subject;
	}

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

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

	public void update() {
		observerState = subject.getSubjectState();
	}
}

public class Test {
	public static void main(String[] args) {
		ConcreteSubject s = new ConcreteSubject();
		s.attach(new ConcreteObserver(s, "X"));
		s.attach(new ConcreteObserver(s, "Y"));
		s.attach(new ConcreteObserver(s, "Z"));
		s.setSubjectState("ABC");
		s.Notify();
	}
}