Java设计模式2:观察者模式1
2017-11-06 23:43
561 查看
一.观察者模式
1.观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新
2.它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性。
3.实现观察者模式有很多形式,一种是“注册—通知—撤销注册”的形式。
4.分类:
Subject(主题)
Observer(观察者)
二.案例
1.气象站的数据被各大电视台即时报导
◆interface Subject.java (主题父接口(可有多个不同子主题实现))
◆interface Observer.java(观察者父接口(可由多个不同子观察者实现))
◆class WeatherData.java(主题的一个子主题实现类(气象站))
◆interface Report.java(报导天气接口)
◆class HuNanTv.java(湖南电视台:观察者一个子实现类)
◆class HuBeiTv.java
◆class MainExec.java(客户端(测试main方法))
此时不用改变主题代码,可以随意添加观察者数量
类图:
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设计模式之Observer 观察者模式
- JAVA设计模式之观察者模式
- java 观察者模式设计方法
- Java设计模式之观察者模式
- 设计模式-观察者模式(Java)
- Java设计模式之观察者模式
- java-设计模式-观察者模式
- Java设计模式-------观察者模式
- Java 设计模式--观察者(Observer)
- Java设计模式—观察者模式
- Java设计模式之观察者模式
- Java 设计模式之观察者模式
- Java设计模式之观察者模式
- java设计模式:观察者模式
- java 设计模式---->观察者模式
- Java设计模式-观察者模式
- 设计模式之观察者模式(有源码简单实现及java函数简单实现)
- Java设计模式之观察者模式
- 【设计模式】java设计模式总述及观察者模式
- java设计模式---观察者模式