欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式应用教程2:观察者模式的应用

程序员文章站 2022-05-25 13:56:27
...

一个观察者,观察两个主题的改进写法。让一个没有特殊父类、接口的普通类,具备被观察的功能。

运行结果:

设计模式应用教程2:观察者模式的应用

主题接口和实现类:

public interface Subject {

	public void addObserver(Observer o);
	public void delObserver(Observer o);
	public void notifyObserver(Object subject);
}

public class ConcreteSubject implements Subject{
	
	ArrayList<Observer> personlist;
	////////////////
	public ConcreteSubject() {
		personlist=new 	ArrayList<Observer>();
	}

	public void addObserver(Observer o)
	{
		personlist.add(o);
	}
	public void delObserver(Observer o)
	{
		personlist.remove(o);
	}
	public void notifyObserver(Object subject)
	{
		for(int i=0;i< personlist.size();i++)
		{
			personlist.get(i).update(subject);
		}
	}
}

气象站的程序,就变得很简单:

//  让一个没有特殊父类、接口的普通类,具备被观察的功能
public class WeatherStation {
	
	//data
	String forecastTime;
	String forecastMessage;
	int temperature;
	//包含一个主题,作为成员变量
	Subject  member_s;
	//constructor
	public WeatherStation() {
		member_s=new ConcreteSubject();
	}
	public void giveMessage(String forecastTime,
			String forecastMessage,int temperature )
	{
		this.forecastMessage = forecastMessage;
		this.forecastTime = forecastTime;
		this.temperature = temperature;
		member_s.notifyObserver(this);
	}
	
	//get method
	public String getForecastMessage() {
		return forecastMessage;
	}
	public String getForecastTime() {
		return forecastTime;
	}
	public int getTemperature() {
		return temperature;
	}
	public Subject getMember_s() {
		return member_s;
	}
	
}

旅行社的代码,不再列出。

观察者的代码:

public class Person implements Observer{
	
	public Person(Subject s) {
		s.addObserver(this);
	}
	public Person(Subject s,Subject s2) {
		s.addObserver(this);
		s2.addObserver(this);
	}

	public void update(Object s)
	{
		//拉模型,获取天气消息,旅行社消息
		if( s instanceof WeatherStation)
		{
			WeatherStation tmp=(WeatherStation)s;
			System.out.println(tmp.getForecastMessage());
			System.out.println(tmp.getForecastTime());
			System.out.println(tmp.getTemperature());
		}
		else if( s instanceof TravelStation)
		{
			TravelStation tmp=(TravelStation)s;
			System.out.println(tmp.getTourTime());
			System.out.println(tmp.getTourMess());
		}
	}

}

同等功能,代码量减少一半。这就是设计模式的目的,架构灵活,方便使用,代码却很少。