java设计模式(二)—观察者模式
2015-11-23 23:42
429 查看
观察者模式:
1.概念:
定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
主题和观察者之间定义了一对多的关系。观察者依赖于此主题,只要主题状态一有变化,观察者就会被通知,并可能更新状态。
2.体现的设计原则:
(1)封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
(2)多用组合,少用继承。
(3)针对接口编程,不针对实现编程。
(4)为交互对象之间的松耦合设计而努力。
3.实现方式
3.1 实现类图
3.2 实现原理
(1) 一个主题对应多个观察者
(2) 依赖产生的原因:主题控制数据源,观察者依赖于主题,当主题变化时更新,这样比起让多份对象控制同一份数据,可以得到更干净的OO设计。
(3)松耦合:对象之间的依赖降到了最低。
1.主题只需知道观察者实现了某个接口(Observer)。不需关注观察者的其它细节。主题唯一依赖的东西是一个实现Observer接口的对象列表。
2.可以随时增加观察者,主题的代码不受影响
3.可以独立复用主题或观察者。
4.改变其它一方,并不影响另一方,因为二者松耦合,只需要接口被遵守。
3.3 实现示例
4.观察者模式缺点
(1)可观察者是一个类而不是一个接口。一个类无法同时具有Obserable类和另一个超类的行为。限制了Obserable的复用潜力。
(2)Observable将关键方法保护起来。setChanged()方法被定义成protected。除非自己继承Observable,否则你无法创建Observable实例并组合到你自己的对象中来。
这个设计违反了“多用组合,少用继承”的原则。
1.概念:
定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
主题和观察者之间定义了一对多的关系。观察者依赖于此主题,只要主题状态一有变化,观察者就会被通知,并可能更新状态。
2.体现的设计原则:
(1)封装变化:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
(2)多用组合,少用继承。
(3)针对接口编程,不针对实现编程。
(4)为交互对象之间的松耦合设计而努力。
3.实现方式
3.1 实现类图
3.2 实现原理
(1) 一个主题对应多个观察者
(2) 依赖产生的原因:主题控制数据源,观察者依赖于主题,当主题变化时更新,这样比起让多份对象控制同一份数据,可以得到更干净的OO设计。
(3)松耦合:对象之间的依赖降到了最低。
1.主题只需知道观察者实现了某个接口(Observer)。不需关注观察者的其它细节。主题唯一依赖的东西是一个实现Observer接口的对象列表。
2.可以随时增加观察者,主题的代码不受影响
3.可以独立复用主题或观察者。
4.改变其它一方,并不影响另一方,因为二者松耦合,只需要接口被遵守。
3.3 实现示例
//被观察者 package observable; import java.util.Observable; import java.util.Observer; public class WeatherData extends Observable { String temperature; String humidity; String pressure; public WeatherData(){ } public void setMeasurements(String temperature,String humidity,String pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } private void measurementsChanged() { setChanged(); notifyObservers(); } public String getTemperature() { return temperature; } public String getHumidity() { return humidity; } public String getPressure() { return pressure; } } //布告板 package observer; import java.util.Observable; import java.util.Observer; import observable.WeatherData; public class CurrentConditionDisplay implements Observer { WeatherData weatherData; String temperature; String humidity; public CurrentConditionDisplay(){ } public CurrentConditionDisplay(Observable observable){ this.weatherData = (WeatherData) observable; weatherData.addObserver(this); } @Override public void update(Observable obs, Object arg) { if(obs instanceof WeatherData){ temperature = weatherData.getTemperature(); humidity = weatherData.getHumidity(); display(); } } private void display() { System.out.println("temperature:"+temperature + "humidity:"+humidity); } } //测试类 package observer; import observable.WeatherData; public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData); weatherData.setMeasurements("20", "30", "20"); } }
4.观察者模式缺点
(1)可观察者是一个类而不是一个接口。一个类无法同时具有Obserable类和另一个超类的行为。限制了Obserable的复用潜力。
(2)Observable将关键方法保护起来。setChanged()方法被定义成protected。除非自己继承Observable,否则你无法创建Observable实例并组合到你自己的对象中来。
这个设计违反了“多用组合,少用继承”的原则。
相关文章推荐
- Java XML解析
- springMVC中相关注解
- 第一个spring冲刺总结
- mac安装/升级java并配置环境变量
- SpringMVC配置
- Java开源在线商城系统 ostocy-jshop
- JAVA服务端的解码
- Spring进阶运用
- java中HashSet实现(转)
- java冒泡排序简易版
- Java获取当前类路径
- 15-11-23 java运算的一些细节
- Java获取当前类路径
- Java获取当前类路径
- java泛型简单学习
- java 静态方法和实例方法的区别
- 现在的大学生啊~[偶遇一奇葩应届java猿]
- Java并发编程:Lock
- org.springframework.web.util.IntrospectorCleanupListener
- Eclipse JavaEE集成开发环境的搭建