`

大话设计模式十四:观察者模式(老板回来,我不知道)

 
阅读更多

观察者模式又叫发布-订阅(Publish/Subscribe)模式。

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

//Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或一个接口实现。它把所有对观察者对象的引用保存在一个聚集里面,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以拉回和删除观察者对象。
public 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 announce()
	{
		for (Observer obj : observers)
		{
			obj.update();
		}
	}
}
//Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个update()方法,这个方法叫做更新方法。
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(String name, ConcreteSubject subject)
	{
		this.name = name;
		this.subject = subject;
	}

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

	public ConcreteSubject getSubject()
	{
		return subject;
	}

	public void setSubject(ConcreteSubject subject)
	{
		this.subject = subject;
	}
}
//客户端代码
public class Main
{
	public static void main(String[] args)
	{
		ConcreteSubject s = new ConcreteSubject();

		s.attach(new ConcreteObserver("X", s));
		s.attach(new ConcreteObserver("Y", s));
		s.attach(new ConcreteObserver("Z", s));

		s.setSubjectState("ABC");
		s.announce();
	}
}
结果显示:
观察者X的新状态是ABC
观察者Y的新状态是ABC
观察者Z的新状态是ABC

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

Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到通知者通知时更新自己更新接口通常包含一个update方法

ConcreteSubject类,叫做具体通知者,将有关状态存入具体观察者对象:在具体通知者的内部状态改变时,给所有登记过的观察者发出通知

ConcreteObserver类,具体观察者,可以保存一个指向具体主题对象的应用


总的来说,就是对通知者抽象,对观察者抽象,通知者持有观察者集合,观察者持有通知者。

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


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics