`

11、观察者模式

 
阅读更多

观察者模式

1、定义

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

2、结构



 

3、代码

(1)主题接口

 

public interface ISubject {
	
	public ISubject registerObserver(IObserver observer);
	public ISubject removeObserver(IObserver observer);
	public void notifyObserver();

}

 

(2)观察者接口

public interface IObserver {

	public void update(String status);
	
}

 

(3)主题实现

public class ConcreteSubject implements ISubject {
	
	private List<IObserver> observerList = new ArrayList<IObserver>();
	private String status;

	@Override
	public ISubject registerObserver(IObserver observer) {
		if(!observerList.contains(observer)){
			observerList.add(observer);
		}
		return this;
	}

	@Override
	public ISubject removeObserver(IObserver observer) {
		if(observerList.contains(observer)){
			observerList.remove(observer);
		}
		return this;
	}

	@Override
	public void notifyObserver() {
		for(IObserver observer: observerList){
			observer.update(status);
		}
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
		//状态改变后执行通知操作
		notifyObserver();
	}
}

 

(4)观察者实现1

public class ConcreteObserver1 implements IObserver{

	@Override
	public void update(String status) {
		System.out.println("ConcreteObserver1收到通知:当前状态为"+status);
	}

}

 

(5)观察者实现2

public class ConcreteObserver2 implements IObserver{

	@Override
	public void update(String status) {
		System.out.println("ConcreteObserver2收到通知:当前状态为"+status);
	}

}

 

(6)客户端

public class Client {
	
	public static void main(String[] args) {
		ConcreteSubject subject = new ConcreteSubject();
		subject.registerObserver(new ConcreteObserver1())
			.registerObserver(new ConcreteObserver2());
		
		subject.setStatus("123");
	}

}

 

4、总结

推模型和拉模型

  在观察者模式中,又分为推模型和拉模型两种方式。

  ●  推模型

     主题对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。

  ●  拉模型

     主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据。一般这种模型的实现中,会把主题对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了。

  • 大小: 9.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics