- 前面讲了观察者模式的“推”数据的方式,接下来时观察者模式的“拉”数据方式。
拉数据方式是指具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法,具体主题在得到通知后,调用具体主题的方法更新自己的数据(即观察者把数据拉过来)。
例子,一家商店发布打折商品信息,包括商品的价格、折后价、名称。有两位顾客,一位关注打折的商品,另一位关心商品折后价格。
/** * */ package org.rico.pattern.demo.observer2; /** * @author rico 2013-3-3 * 主题:定义具体主题需要实现的方法,如:添加、删除、通知观察者的方法。 */ public interface Subject { /** * 新增观察者 * @param observer */ public void add(Observer observer); /** * 删除观察者 * @param observer */ public void delete(Observer observer); /** * 主题通知观察者更新数据 */ public void notifyObserver(); }
/** * */ package org.rico.pattern.demo.observer2.impl; import java.util.ArrayList; import java.util.List; import org.rico.pattern.demo.observer2.Observer; import org.rico.pattern.demo.observer2.Subject; /** * @author rico 2013-3-3 * */ public class ShopSubject implements Subject { private List<Observer> observers = null; private int oldPrice, newPrice; private String goodName; public ShopSubject() { observers = new ArrayList<Observer>(); } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.Subject#add(org.rico.pattern.demo.observer.Observer) */ @Override public void add(Observer observer) { if(!observers.contains(observer)) { observers.add(observer); } } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.Subject#delete(org.rico.pattern.demo.observer.Observer) */ @Override public void delete(Observer observer) { if(observers.contains(observer)) { observers.remove(observer); } } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.Subject#notifyObserver() */ @Override public void notifyObserver() { for(Observer ob : observers) { ob.update(); } } //设置商品信息 public void setGoods(String goodName, int oldPrice, int newPrice) { this.setGoodName(goodName); this.setOldPrice(oldPrice); this.setNewPrice(newPrice); this.notifyObserver(); } public List<Observer> getObservers() { return observers; } public void setObservers(List<Observer> observers) { this.observers = observers; } public int getOldPrice() { return oldPrice; } public void setOldPrice(int oldPrice) { this.oldPrice = oldPrice; } public int getNewPrice() { return newPrice; } public void setNewPrice(int newPrice) { this.newPrice = newPrice; } public String getGoodName() { return goodName; } public void setGoodName(String goodName) { this.goodName = goodName; } }
/** * */ package org.rico.pattern.demo.observer2; /** * @author rico 2013-3-4 * 观察者 */ public interface Observer { public void update(); }
/** * */ package org.rico.pattern.demo.observer2.impl; import org.rico.pattern.demo.observer2.Observer; import org.rico.pattern.demo.observer2.Subject; /** * @author rico 2013-3-4 * 顾客(具体观察者) */ public class CustomerOne implements Observer { private Subject subject; private String name; public CustomerOne(Subject subject, String name) { this.subject = subject; this.name = name; subject.add(this); } /* 顾客从商店“拉去”数据,更新自己的数据(non-Javadoc) * @see org.rico.pattern.demo.observer2.Observer#update() */ @Override public void update() { if(subject instanceof ShopSubject) { ShopSubject su = (ShopSubject) subject; System.out.println("顾客:" + name + ","); System.out.println("只对商品名称感兴趣,"); System.out.println("商品名称:" + su.getGoodName()); } else { System.out.println("获取到任何数据..."); } } }
/** * */ package org.rico.pattern.demo.observer2.impl; import org.rico.pattern.demo.observer2.Observer; import org.rico.pattern.demo.observer2.Subject; /** * @author rico 2013-3-4 * 顾客(具体观察者) */ public class CustomerTwo implements Observer { private Subject subject; private String name; public CustomerTwo(Subject subject, String name) { this.subject = subject; this.name = name; subject.add(this); } /* 顾客从商店“拉去”数据,更新自己的数据(non-Javadoc) * @see org.rico.pattern.demo.observer2.Observer#update() */ @Override public void update() { if(subject instanceof ShopSubject) { ShopSubject su = (ShopSubject) subject; System.out.println("顾客:" + name + ","); System.out.println("只对商品价格感兴趣,"); System.out.println("商品价格:" + su.getNewPrice() + "-" + su.getOldPrice()); } else { System.out.println("获取到任何数据..."); } } }
/** * */ package org.rico.pattern.demo.observer2; import org.rico.pattern.demo.observer2.impl.CustomerOne; import org.rico.pattern.demo.observer2.impl.CustomerTwo; import org.rico.pattern.demo.observer2.impl.ShopSubject; /** * @author rico 2013-3-3 * */ public class ObserverTest { /** * @param args */ public static void main(String[] args) { ShopSubject subject = new ShopSubject(); Observer university = new CustomerOne(subject, "rico"); Observer haigui = new CustomerTwo(subject, "admin"); System.out.println("###################感冒999#######################"); subject.setGoods("感冒999", 10, 8); System.out.println("###################可口可乐#######################"); subject.setGoods("可口可乐", 6, 5); } }
相关推荐
【例6.19】事件体系结构-观察者模式-温度显示 【例6.21】层次架构-软件测试 【例6.22】层次架构-银行- Access数据库 【例6.23】MVC架构-二手车拍卖-无观察者 【例6.24】MVC架构-二手车拍卖-观察者-3...
12.3 深入理解观察者模式 (1)深入理解 ISubject、IObserver 接口 上文中的 Subject 类中的中心数据 data 是 String 类型的,因此 IObserver 接口中定义的 refresh() 方法参数类型也是 String 类型的。若 data 改...
观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - 封装常用的...
这个代码主要以Android中的TextView发生变化,而凡是订阅了此类消息的实体类对象均能够打印出日志。例子很简单,起抛砖引玉,希望大家能够理解观察者模式在Android中的应用
一个数据频繁模式挖掘的算法实现,采用java设计模式中的观察者模式。其中不仅包含java project运行文件,还包括总结的PPT(内部含有我画的类图与时序图)。
请根据观察者模式,用Java语言设计并实现气象站程序。其中,部分代码已经写好,包括: • 观察者接口 • 主题接口 • 显示板接口 • 测试程序 请在此框架下,继续完成CurrentConditionsDisplay、ForecastDisplay...
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...
观察者模式 源代码 样例:李先生希望及时知道气象站所维护的每日天气数据,例如:最高气温和最低气温等,同时还希望及时知道旅行社每日的旅游信息。 采用观察者模式设计,其中李先生就是一个具体的观察者,而气象站...
观察者模式中关键的00P概念 观察者模式最小化示例 实例:添加状态并标识用户 动态地改变状态 实例:采用不同的形式显示数据 小结 第9章 模板方法模式 什么是模板方法模式7 模板方法用到的主要()OP概念 最小...
这就要说到今天总结的观察者模式了,作为设计模式大家庭中最重要的一个,我们不得不去好好的学习一下观察者模式。 观察者模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象...
而我们常见的mvc模式,v是指view-视图,m指model-模型,有点类似观察者模式,模型中的数据,一有变化通知相关联的视图. 这样很方便地隔离开了模型和视图. 这里使用的例子是关于博客的订阅. 博客属于被观察的...
观察者模式: 让多个观察者对象同时监听某一个 观察者模式 观察者模式定义了一种一队多的依赖关系, 主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更 新自己。 20、STATE —...
观察者12.1 何为观察者模式12.2 何时使用观察者模式12.3 在模型-视图-控制器中使用观察者模式12.4 在Cocoa Touch框架中使用观察者模式12.4.1 通知12.4.2 键-值观察12.5 在TouchPainter中更新CanvasView上的线条12.6 ...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
工厂模式定义一个创建对象的接口,让子类决定实例化哪一个类 5观察者模式的推拉有什么不同?适用场景 现在要说的分歧在这里: "推"的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新 消息...
观察者模式:对象间的一对多的依赖关系。 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。 中介者模式:用一个中介对象来封装一系列的对象交互。 命令模式:将命令请求封装为一个对象,使得可以用不同的...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...