`
xgcai
  • 浏览: 8651 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

设计模式--观察者与多主题

 
阅读更多

观察者与多主题:一个观察者可以依赖于多个主题,当所依赖的任何主题数据发生变化时,该观察者都能得到通知。处理多主题采用的是拉数据方式。

 

例子:李先生想了解每天的天气预报信息和每日的旅游信息。

 

/**
 * 
 */
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("暂无旅游信息。");
	}

}

 

分享到:
评论

相关推荐

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式---观察者模式

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以及时地在对象之间传播状态变化。在Java中,观察者模式常用于构建事件驱动系统,使得多个对象能够监听并响应某个对象的状态改变。 首先,我们要理解...

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    C++设计模式--观察者模式 demo

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它在C++中的应用广泛且实用。这种模式的核心思想是“主体”(Subject)与“观察者”(Observer)之间的松耦合关系,允许一个对象(即主体)的状态...

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    设计模式-观察者模式.ppt

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。这个模式的核心在于建立一种一对多的关系,当一个对象的状态改变时,所有依赖于它的对象都会得到...

    跟我一起学 设计模式-观察者模式

    观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...

    设计模式-观察者模式(讲解及其实现代码)

    总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的系统时。HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念...

    设计模式专题之(十八)观察者模式---设计模式观察者模式示例代码(python--c++)

    观察者模式是软件设计模式中的一种行为模式,它允许一个对象,称为"主题",维护一个依赖于它的对象列表,这些对象被称为"观察者"。当主题的状态发生改变时,它会通知所有观察者,使它们能够自动更新自己。这种模式在...

    设计模式-观察者模式(读书笔记)

    观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这个模式在很多场景下都有广泛的应用,例如事件处理、...

    java常用设计模式-观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。该模式适用于需要在对象间建立动态的、松散耦合的关系的...

    设计模式-观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在iOS开发中尤其常见,因为...

    java设计模式-观察者 小案例

    观察者模式(Observer Pattern)是其中一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在Java中,观察者模式通常通过`java.util....

    设计模式之观察者模式

    观察者模式是面向对象设计中的一种经典模式,它在软件工程中扮演着重要的角色,用于实现对象间的松耦合。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    c#代码介绍23种设计模式-17观察者模式(附代码)

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。 2. 观察者模式的结构 从上面观察者模式的...

    java23种设计模式之观察者模式

    **观察者模式(Observer Pattern)**是软件设计模式中的一种行为模式,它在Java中有着广泛的应用。这个模式的核心思想是“一对多”的依赖关系,即一个主题对象(Subject)可以被多个观察者(Observer)关注,当主题...

    设计模式-Java语言中的应用

    设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...

    游戏设计2-观察者模式的应用-攻击

    游戏设计中的观察者模式是一种行为设计模式,它允许对象在状态改变时通知其他对象,而无需显式地引用它们。这种模式广泛应用于游戏开发中,特别是在处理事件驱动和多对象交互的场景。在这个"游戏设计2-观察者模式的...

Global site tag (gtag.js) - Google Analytics