《研磨设计模式》chap12 观察者模式observer(1)模式简介

场景:读者订杂志,订报纸,当有新的期刊和版本来了,读者怎么知道?

1. 模式介绍
《研磨设计模式》chap12 观察者模式observer(1)模式简介

public 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);
	}

	//通知所有注册的观察者对象 
	protected void notifyObservers() {
		for(Observer observer : observers){
			observer.update(this);
		}
	}
}

public class ConcreteSubject extends Subject { 
	private String subjectState;	//示意,目标对象的状态 
	public String getSubjectState() {
		return subjectState;
	}
	public void setSubjectState(String subjectState) {
		this.subjectState = subjectState;
		//状态发生了改变,通知各个观察者
		this.notifyObservers();
	}
}

//观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 
public interface Observer {
	//更新的接口 
	public void update(Subject subject); 
}

public class ConcreteObserver implements Observer { 
	private String observerState;	//示意,观者者的状态 
	public void update(Subject subject) {
		// 具体的更新实现
		//这里可能需要更新观察者的状态,使其与目标的状态保持一致
		observerState = ((ConcreteSubject)subject).getSubjectState();
	}
}

2. 应用到场景
《研磨设计模式》chap12 观察者模式observer(1)模式简介

public interface Observer {
	//被通知的方法,直接把报纸的内容推送过来 	 
	public void update(String content);
}

public class Reader implements Observer{
	//读者的姓名 
	private String name;

	public void update(String content) {
		//这是采用推的方式
		System.out.println(name+"收到报纸了,阅读先。内容是==="+content);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

public class Subject {
	// 用来保存注册的观察者对象,也就是报纸的订阅者 
	private List<Observer> readers = new ArrayList<Observer>();

	//报纸的读者需要先向报社订阅,先要注册 
	public void attach(Observer reader) {
		readers.add(reader);
	}

	//报纸的读者可以取消订阅 
	public void detach(Observer reader) {
		readers.remove(reader);
	}
	// 当每期报纸印刷出来后,就要迅速的主动的被送到读者的手中, 
	protected void notifyObservers(String content) {
		for(Observer reader : readers){
			reader.update(content);
		}
	}
}

public class NewsPaper extends Subject{ 
	private String content;	//报纸的具体内容
	 
	public String getContent() {
		return content;
	}
	//示意,设置报纸的具体内容,相当于要出版报纸了 
	public void setContent(String content) {
		this.content = content;
		//内容有了,说明又出报纸了,那就通知所有的读者
		notifyObservers(content);
	}
}

public class Client {
	public static void main(String[] args) {
		//创建一个报纸,作为被观察者
		NewsPaper subject = new NewsPaper();
		
		//创建阅读者,也就是观察者
		Reader reader1 = new Reader();
		reader1.setName("张三");
		
		Reader reader2 = new Reader();
		reader2.setName("李四");
		
		Reader reader3 = new Reader();
		reader3.setName("王五");
		
		//注册阅读者
		subject.attach(reader1);
		subject.attach(reader2);
		subject.attach(reader3);
		
		//要出报纸啦
		subject.setContent("本期内容是观察者模式");
	}
}
上一篇:17-观察者模式


下一篇:《研磨设计模式》chap12 观察者模式observer(2)模式介绍