您的位置:首页 > 编程语言 > Java开发

Java设计模式2:观察者模式1

2017-11-06 23:43 561 查看
一.观察者模式

1.观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

2.它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性。

3.实现观察者模式有很多形式,一种是“注册—通知—撤销注册”的形式。

4.分类:

Subject(主题)

Observer(观察者)





二.案例

1.气象站的数据被各大电视台即时报导

◆interface Subject.java (主题父接口(可有多个不同子主题实现))

package tiglle.pattern.Observer;
//主题父接口(可有多个不同子主题实现)
public interface Subject {

//注册观察者
public void registerObserver(Observer o);

//删除观察者
public void removeObserver(Observer o);

//当主题状态发生改变,调用此方法通知观察者
public void notifyObserver();
}


◆interface Observer.java(观察者父接口(可由多个不同子观察者实现))

package tiglle.pattern.Observer;
//观察者父接口(可由多个不同子观察者实现)
public interface Observer {

//当主题状态发生改变,会调用此方法并传入主题的参数
public void update(int wendu,int shidu,int qiya);

}


◆class WeatherData.java(主题的一个子主题实现类(气象站))

package tiglle.pattern.Observer;

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

//主题的一个子主题实现类(气象站)
public class WeatherData implements Subject{

//天气参数
private int wendu;//温度
private int shidu;//湿度
private int qiya;//气压

//记录注册的观察者
private List<Observer> observers;

//构造方法,实例化observers
public WeatherData(){
observers = new ArrayList<>();
}

//注册观察者
@Override
public void registerObserver(Observer o) {
observers.add(o);
}

//移除观察者
@Override
public void removeObserver(Observer o) {
int index = observers.indexOf(o);
if(index>=0){
observers.remove(index);
}
}

//当主题状态发生改变,调用此方法通知观察者
@Override
public void notifyObserver() {
for(Observer o:observers){
o.update(wendu, shidu, qiya);
}
}

//天气(主题子类)发生改变调用的方法,通知观察者
public void weatherChanged(){
//真正通知观察者
notifyObserver();
}

//设置天气参数,并通知观察者
public void setWeatherParame(int wendu,int shidu,int qiya){
this.wendu = wendu;
this.shidu = shidu;
this.qiya = qiya;
//通知观察者
weatherChanged();
}

}


◆interface Report.java(报导天气接口)

package tiglle.pattern.Observer;
//报导天气接口
public interface Report {

public void report();

}


◆class HuNanTv.java(湖南电视台:观察者一个子实现类)

package tiglle.pattern.Observer;
//湖南电视台:观察者一个子实现类
public class HuNanTv implements Observer,Report{

//天气属性
private int wendu;
private int shidu;
private int qiya;

//主题子实现类,用于构造函数中注册观察者
private Subject subject;

//构造函数,注册观察者
public HuNanTv(Subject subject) {
this.subject = subject;
subject.registerObserver(this);
}

//改变天气属性
@Override
public void update(int wendu, int shidu, int qiya) {
this.wendu = wendu;
this.shidu = shidu;
this.qiya = qiya;
//报导天气
report();
}

//报导天气
@Override
public void report() {
System.out.println("湖南人民注意了,当前温度:"+wendu+",当前湿度:"+shidu+",当前气压:"+qiya);
}

}


◆class HuBeiTv.java

package tiglle.pattern.Observer;
//湖北电视台:观察者一个子实现类
public class HuBeiTv implements Observer,Report{

//天气属性
private int wendu;
private int shidu;
private int qiya;

//主题子实现类,用于构造函数中注册观察者
private Subject subject;

//构造函数,注册观察者
public HuBeiTv(Subject subject) {
this.subject = subject;
subject.registerObserver(this);
}

@Override
public void update(int wendu, int shidu, int qiya) {
this.wendu = wendu;
this.shidu = shidu;
this.qiya = qiya;
//报导天气
report();
}

//报导天气
@Override
public void report() {
System.out.println("湖北人民注意了,当前温度:"+wendu+",当前湿度:"+shidu+",当前气压:"+qiya);
}
}


◆class MainExec.java(客户端(测试main方法))

package tiglle.pattern.Observer;
//客户端(测试main方法)
public class MainExec {

public static void main(String[] args) {
//实例化气象站(主题)
WeatherData weatherData = new WeatherData();

//实例化电视台(观察者),并注册进主题
Observer hunanTv = new HuNanTv(weatherData);
Observer hubeiTv = new HuBeiTv(weatherData);

//当气象站(主题)发生变化,电视台(观察者)马上进行报道
weatherData.setWeatherParame(32, 25, 30);
weatherData.setWeatherParame(10, 20, 30);
weatherData.setWeatherParame(50, 60, 70);
}
}

运行结果:
湖南人民注意了,当前温度:32,当前湿度:25,当前气压:30
湖北人民注意了,当前温度:32,当前湿度:25,当前气压:30

湖南人民注意了,当前温度:10,当前湿度:20,当前气压:30
湖北人民注意了,当前温度:10,当前湿度:20,当前气压:30

湖南人民注意了,当前温度:50,当前湿度:60,当前气压:70
湖北人民注意了,当前温度:50,当前湿度:60,当前气压:70


此时不用改变主题代码,可以随意添加观察者数量

类图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java java设计模式