- 前面讲了观察者模式的“推”数据的方式,接下来时观察者模式的“拉”数据方式。
拉数据方式是指具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法,具体主题在得到通知后,调用具体主题的方法更新自己的数据(即观察者把数据拉过来)。
例子,一家商店发布打折商品信息,包括商品的价格、折后价、名称。有两位顾客,一位关注打折的商品,另一位关心商品折后价格。
/** * */ 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); } }
相关推荐
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...
观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以及时地在对象之间传播状态变化。在Java中,观察者模式常用于构建事件驱动系统,使得多个对象能够监听并响应某个对象的状态改变。 首先,我们要理解...
行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...
观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...
总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是主体(Subject)与观察者(Observer)之间的...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
Java设计模式中的观察者模式(Observer Pattern)是一种对象行为型模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件处理和实时...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...
观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的系统时。HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念...
3. **观察者模式** - QT4的信号和槽机制是观察者模式的实现。当一个对象的某个状态改变时,它可以发出信号,其他对象可以通过连接这些信号并定义槽函数来响应这些变化,实现了事件驱动的编程模型。 4. **装饰器模式...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在iOS开发中尤其常见,因为...
本篇文章将深入探讨Qt中的观察者模式(Observer Pattern),这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心...
设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...
观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计中的一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...
在给定的压缩包文件中,"设计模式例子,观察者模式,建造者模式" 提到了两种重要的设计模式:观察者模式(Observer Pattern)和建造者模式(Builder Pattern)。下面我们将深入探讨这两种设计模式的概念、应用场景、...
- 观察者模式 - 模板方法模式 - 迭代器模式 - 代理模式 - 适配器模式 2. 设计模式的基本要素: - 名字 - 意图 - 问题 - 解决方案 - 参与者与协作者 - 实现 - 一般性构造 3. 设计模式的应用场景: - ...