设计模式应用教程2:观察者模式的应用
程序员文章站
2022-05-25 13:56:27
...
一个观察者,观察两个主题的改进写法。让一个没有特殊父类、接口的普通类,具备被观察的功能。
运行结果:
主题接口和实现类:
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());
}
}
}
同等功能,代码量减少一半。这就是设计模式的目的,架构灵活,方便使用,代码却很少。
上一篇: 华为机试在线训练C++版(31~40)
下一篇: 五子棋项目 --C语言