Java 设计模式 (2) 观察者模式
来源:互联网 发布:淘宝不死 中国不富 编辑:程序博客网 时间:2024/06/09 19:18
要点:
观察者模式定义了对象之间一对多的关系。
主题(也可以是观察者)用同一共同接口来更新观察者
被观察者和观察者之间用松耦合方式结合,被观察者不知道观察者的细节,只知道观察者实现了观察者接口。
使用此模式时,你可以从被观察者处推或者拉数据(然而,推的方式被认为更”正确“)
有多个观察者时,不可以依赖特定的通知次序。
Java有多中观察者模式的实现,包括了通用的Java.util
我通过火车速度,火车驾驶员以及乘客的例子来运用观察者模式。
当火车速度改变时,我们需要告知火车驾驶员以及乘客。所以在这里火车速度是被观察者,而火车驾驶员乘客属于观察者。
我在这里定义了一个被观察者接口。
public interface Subject {//用于观察者来注册public void registerObserver(Observer o);//用于观察者解除绑定public void removeObserver(Observer o);//用于通知所有观察者public void notifyObservers();}
然后定义了一个观察者接口。
public interface Observer {//用于接收被观察者的数据更新public void update(int speed);}
然后让火车速度实现被观察者接口,让火车驾驶员和乘客实现观察者接口。
public class SpeedData implements Subject{//用于储存所有的观察者private ArrayList observers;private int speed;public SpeedData(){observers = new ArrayList();}@Overridepublic void registerObserver(Observer o) {// TODO Auto-generated method stubobservers.add(o);}@Overridepublic void removeObserver(Observer o) {// TODO Auto-generated method stubint i = observers.indexOf(o);if(i >=0 ){observers.remove(i);}}@Overridepublic void notifyObservers() {// TODO Auto-generated method stubfor(int i=0; i< observers.size(); i++){Observer oberver = (Observer) observers.get(i);oberver.update(speed);}}public void SpeedChanged(){notifyObservers();}public void setSpeed(int speed){this.speed = speed;SpeedChanged();}}
public class Traindriver implements Observer{public int length = 100;public SpeedData speedData;public Traindriver(SpeedData speedData){this.speedData = speedData;speedData.registerObserver(this);}@Overridepublic void update(int speed) {// TODO Auto-generated method stubint time = length/speed;System.out.println("火车驾驶员:火车还有"+time+"分钟到站");}}
public class Passenger implements Observer{public int oldspeed;public SpeedData speedData;public Passenger(SpeedData speedData){//半成年主题的实例,并将观察者注册到主题this.speedData = speedData;speedData.registerObserver(this);}@Overridepublic void update(int speed) {// TODO Auto-generated method stubif(speed>oldspeed)System.out.println("乘客:火车变快了,我可以快点回家了");elseSystem.out.println("乘客:火车变慢了,我要晚点才能到家了");oldspeed = speed;}}
public class Test {public static void main(String[] args){SpeedData speedData = new SpeedData();Traindriver traindriver = new Traindriver(speedData);Passenger passenger = new Passenger(speedData);speedData.setSpeed(10);speedData.setSpeed(20);speedData.setSpeed(5);//乘客说我好烦,速度变慢了,我不想知道速度了。所以取消绑定 PassengerspeedData.removeObserver(passenger);speedData.setSpeed(12);}/*out~火车驾驶员:火车还有10分钟到站乘客:火车变快了,我可以快点回家了火车驾驶员:火车还有5分钟到站乘客:火车变快了,我可以快点回家了火车驾驶员:火车还有20分钟到站乘客:火车变慢了,我要晚点才能到家了火车驾驶员:火车还有8分钟到站*/}
出版者+订阅者 = 观察者模式,在这里火车速度为出版者,而火车驾驶员和乘客属于订阅者。
0 0
- Java与设计模式(2)--观察者模式
- JAVA设计模式之观察者模式2
- Java 设计模式 (2) 观察者模式
- Java设计模式2:观察者模式1
- java设计模式-----观察者
- JAVA 观察者设计模式
- java观察者设计模式
- java观察者设计模式
- java 观察者设计模式
- JAVA-观察者设计模式
- JAVA设计模式--观察者
- Java---观察者设计模式
- Java设计模式:观察者
- Java设计模式-观察者
- java观察者设计模式
- java设计模式-观察者模式
- java设计模式---观察者模式
- java设计模式---观察者模式
- 《SPRING实战第三版》1~4章笔记
- bower
- spring mvc启动成功配置也成功,但访问不到controller也访问不到任何jsp的解决办法
- 你不再需要动态网页——编辑-发布-开发分离
- getprop使用简介
- Java 设计模式 (2) 观察者模式
- JavaWeb学习总结(五十)——文件上传和下载
- Python基础学习-小代码1【爬取网页图片】
- Service的整理,持续更新
- 谈谈SSH框架的执行流程
- DP--分组背包--HDU - 1712
- 稀疏矩阵的实现(三元组存储)C++
- ACM常用模板——数据结构——区间最值查询RMQ
- listView下拉加载更多