观察者与多主题:一个观察者可以依赖于多个主题,当所依赖的任何主题数据发生变化时,该观察者都能得到通知。处理多主题采用的是拉数据方式。
例子:李先生想了解每天的天气预报信息和每日的旅游信息。
/** * */ package org.rico.pattern.demo.observer.observer3; /** * @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.observer.observer3; /** * @author rico 2013-3-3 * 定义具体观察者用来更新数据的方法。 */ public interface Observer { /** * 观察者接受主题数据变化的通知,然后更新自己的数据。 * @param msg */ public void update(Subject subject); }
/** * */ package org.rico.pattern.demo.observer.observer3.impl; import java.util.ArrayList; import java.util.List; import org.rico.pattern.demo.observer.observer3.Observer; import org.rico.pattern.demo.observer.observer3.Subject; /** * @author rico 2013-3-4 * 气象站(具体主题) */ public class Weather implements Subject { private List<Observer> observers; private String msg; private int low; private int high; public Weather() { observers = new ArrayList<Observer>(); } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Subject#add(org.rico.pattern.demo.observer.observer3.Observer) */ @Override public void add(Observer observer) { if(!observers.contains(observer)) { observers.add(observer); } } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Subject#delete(org.rico.pattern.demo.observer.observer3.Observer) */ @Override public void delete(Observer observer) { if(observers.contains(observer)) { observers.remove(observer); } } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Subject#notifyObserver() */ @Override public void notifyObserver() { for(Observer ob : observers) { ob.update(this); } } //更新天气信息 public void doForecast(String msg, int low, int high) { this.setMsg(msg); this.setLow(low); this.setHigh(high); this.notifyObserver(); } public List<Observer> getObservers() { return observers; } public void setObservers(List<Observer> observers) { this.observers = observers; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getLow() { return low; } public void setLow(int low) { this.low = low; } public int getHigh() { return high; } public void setHigh(int high) { this.high = high; } }
/** * */ package org.rico.pattern.demo.observer.observer3.impl; import java.util.ArrayList; import java.util.List; import org.rico.pattern.demo.observer.observer3.Observer; import org.rico.pattern.demo.observer.observer3.Subject; /** * @author rico 2013-3-4 * 旅行社(具体主题) */ public class TravelAgency implements Subject { private List<Observer> observers; private String msg; public TravelAgency() { observers = new ArrayList<Observer>(); } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Subject#add(org.rico.pattern.demo.observer.observer3.Observer) */ @Override public void add(Observer observer) { if(!observers.contains(observer)) { observers.add(observer); } } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Subject#delete(org.rico.pattern.demo.observer.observer3.Observer) */ @Override public void delete(Observer observer) { if(observers.contains(observer)) { observers.remove(observer); } } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Subject#notifyObserver() */ @Override public void notifyObserver() { for(Observer ob : observers) { ob.update(this); } } //更新旅游社信息 public void giveMsg(String msg) { this.setMsg(msg); this.notifyObserver(); } public List<Observer> getObservers() { return observers; } public void setObservers(List<Observer> observers) { this.observers = observers; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
/** * */ package org.rico.pattern.demo.observer.observer3.impl; import org.rico.pattern.demo.observer.observer3.Observer; import org.rico.pattern.demo.observer.observer3.Subject; /** * @author rico 2013-3-4 * */ public class Person implements Observer { private Subject weatherSub; private Subject travelSub; public Person(Subject weatherSub, Subject travelSub) { this.setWeatherSub(weatherSub); this.setTravelSub(travelSub); weatherSub.add(this); travelSub.add(this); } /* (non-Javadoc) * @see org.rico.pattern.demo.observer.observer3.Observer#update(org.rico.pattern.demo.observer.observer3.Subject) */ @Override public void update(Subject subject) { if(subject instanceof Weather) { Weather weather = (Weather) subject; System.out.println("天气信息:" + weather.getMsg() + "-最高温:" + weather.getHigh() + "-最低温:" + weather.getLow()); } else if(subject instanceof TravelAgency) { TravelAgency travel = (TravelAgency) subject; System.out.println("旅行社信息: " + travel.getMsg()); } } public Subject getWeatherSub() { return weatherSub; } public void setWeatherSub(Subject weatherSub) { this.weatherSub = weatherSub; } public Subject getTravelSub() { return travelSub; } public void setTravelSub(Subject travelSub) { this.travelSub = travelSub; } }
/** * */ package org.rico.pattern.demo.observer.observer3; import org.rico.pattern.demo.observer.observer3.impl.Person; import org.rico.pattern.demo.observer.observer3.impl.TravelAgency; import org.rico.pattern.demo.observer.observer3.impl.Weather; /** * @author rico 2013-3-4 * */ public class Test { /** * @param args */ public static void main(String[] args) { Weather weather = new Weather(); TravelAgency travel = new TravelAgency(); Observer observer = new Person(weather, travel); weather.doForecast("阴天", 10, 20); travel.giveMsg("暂无旅游信息。"); } }
相关推荐
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...
观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以及时地在对象之间传播状态变化。在Java中,观察者模式常用于构建事件驱动系统,使得多个对象能够监听并响应某个对象的状态改变。 首先,我们要理解...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它在C++中的应用广泛且实用。这种模式的核心思想是“主体”(Subject)与“观察者”(Observer)之间的松耦合关系,允许一个对象(即主体)的状态...
观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...
观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。这个模式的核心在于建立一种一对多的关系,当一个对象的状态改变时,所有依赖于它的对象都会得到...
观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...
总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...
观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的系统时。HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念...
观察者模式是软件设计模式中的一种行为模式,它允许一个对象,称为"主题",维护一个依赖于它的对象列表,这些对象被称为"观察者"。当主题的状态发生改变时,它会通知所有观察者,使它们能够自动更新自己。这种模式在...
观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这个模式在很多场景下都有广泛的应用,例如事件处理、...
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。该模式适用于需要在对象间建立动态的、松散耦合的关系的...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在iOS开发中尤其常见,因为...
观察者模式(Observer Pattern)是其中一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在Java中,观察者模式通常通过`java.util....
观察者模式是面向对象设计中的一种经典模式,它在软件工程中扮演着重要的角色,用于实现对象间的松耦合。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。 2. 观察者模式的结构 从上面观察者模式的...
**观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...
设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...
游戏设计中的观察者模式是一种行为设计模式,它允许对象在状态改变时通知其他对象,而无需显式地引用它们。这种模式广泛应用于游戏开发中,特别是在处理事件驱动和多对象交互的场景。在这个"游戏设计2-观察者模式的...