设计模式之---观察者模式

原创 2015年11月20日 20:17:53

一、定义

观察者模式分为主题类和观察者类。当主题类管理监测的内容有变化时,会及时通知所有与这个主题绑定的观察者们。

二、实现

观察者模式是一对多依赖的关系:每个主题都依赖多个观察者。

每当有新的主题产生时,就需要加入观察者;

每当有观察者厌恶这个主题时,就会离开。

每当主题内容有变化时,就需要通知各个观察者。

 

所以,针对上述几个需求:主题类接口中需要包含:加入,删除,通知三个抽象方法。

而实现主题接口的类中,也需要有一个装观察者的队列。

 

例如:

现在有一个天气主题,很多人对这个感兴趣。

所以纷纷注册成为天气主题的观察者。

每当天气变化的时候,天气类就会把温度等参数及时通知给所有观察者。

三、类图和代码


package test;

import java.util.ArrayList;
import java.util.List;

interface Observer{
	public void update(double temperature);
}

interface Theme{
	public void addObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObserver();
}

class Weather implements Theme{
	List<Observer> obs;
	double temperature;
	
	Weather(){
		obs=new ArrayList<Observer>();
	}
	
	@Override
	public void addObserver(Observer o) {
		// TODO Auto-generated method stub
		obs.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		// TODO Auto-generated method stub
		obs.remove(o);
	}

	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub
		for(Observer i:obs){
			i.update(temperature);
		}
	}
	
	public void changeTemperature(double temperature){
		//...........
		this.temperature=temperature;
	}
	
}

class Person implements Observer {
	String name;

	Person(String name) {
		this.name = name;
	}

	@Override
	public void update(double temperature) {
		// TODO Auto-generated method stub
		System.out.println(name+" has been notified the temperature = "+temperature);
	}

}

public class practice {
	public static void main(String[] args) {
		//生成主题
		Weather weather = new Weather();
		Theme t=weather;
		
		//加入三个观察者
		t.addObserver(new Person("zhangsan1"));
		t.addObserver(new Person("zhangsan2"));
		t.addObserver(new Person("zhangsan3"));
		
		//修改温度
		weather.changeTemperature(24);
		
		//通知观察者们
		t.notifyObserver();
	}
}


四、适用场景

一个类的变化会要求其他关联类都产生相应变化的情况。

五、总结

观察者模式很好的解决了一对多关联关系中的多次重复修改问题,使得代码效率得到提升。



版权声明:本文为博主原创文章,未经博主允许不得转载。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之---观察者模式
举报原因:
原因补充:

(最多只允许输入30个字)