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

Observer Pattern的一个实现

 
阅读更多

Java的API中有两组接口类是用来写观察者模式分别是java.util.Observable、java.util.Observer。

 

 

现实场景:有一名店(Shop),为了财物安全起见,除了在店内装了摄像头(Camera)来监控店内的总人数外,还聘请了一些门卫(Guard)守在店门口,对来访的客人进行实名登记,即客人进入时要记名,客人出店时也要记录其离去。

 

 

观察者(Camera)

package observer;

import java.util.Observable;
import java.util.Observer;

/**
 * @author yingmu
 * @version 2011-3-16 下午05:29:10
 */
public class Camera implements Observer {

	private int id;

	public Camera(int id) {
		this.id = id;
	}

	@Override
	public void update(Observable o, Object obj) {
		Message message = (Message) obj;
		if (message.getAcutinType().equals("in")) {
			System.out.println("摄像头" + this.id + "号,监控到1个人进入商店,当前店内有"
					+ message.getTotal() + "个人");
		} else if (message.getAcutinType().equals("out")) {
			System.out.println("摄像头" + this.id + "号,监控到个人离开商店,当前店内有"
					+ message.getTotal() + "个人");
		}
	}
}

 

 

观察者(Guard)

package observer;

import java.util.Observable;
import java.util.Observer;

/**
 * @author yingmu
 * @version 2011-3-16 下午05:28:53
 */
public class Guard implements Observer {

	private String name;

	public Guard(String name) {
		this.name = name;
	}

	@Override
	public void update(Observable o, Object obj) {
		Message guidMessage = (Message) obj;
		if (guidMessage.getAcutinType().equals("in")) {
			System.out.println("保安" + this.name + "汇报:"
					+ guidMessage.getCustomer() + "进入商店");
		} else if (guidMessage.getAcutinType().equals("out")) {
			System.out.println("保安" + this.name + "汇报:"
					+ guidMessage.getCustomer() + "离开商店");
		}
	}

	public String toString() {
		return name;
	}
}

 

 

被观察者(Shop)

package observer;

import java.util.HashSet;
import java.util.Observable;
import java.util.Set;

/**
 * @author yingmu
 * @version 2011-3-16 下午05:28:35
 */
public class Shop extends Observable {
	private static final String IN = "in";
	private static final String OUT = "out";
	private Set<String> personSet = new HashSet<String>();

	public void comeIn(String name) {
		personSet.add(name);

		Message message = new Message();
		message.setAcutinType(IN);
		message.setCustomer(name);
		message.setTotal(personSet.size());
		
		setChanged();
		notifyObservers(message); // 通知观察者
	}

	public void getOut(String name) {
		personSet.remove(name);

		Message message = new Message();
		message.setAcutinType(OUT);
		message.setCustomer(name);
		message.setTotal(personSet.size());
		
		setChanged();
		notifyObservers(message); // 通知观察者
	}

}

 

 

消息体(Message)

package observer;

/**
 * @author yingmu
 * @version 2011-3-16 下午05:45:01
 */
public class Message {
	private String acutinType;
	private String customer;
	private int total;

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public String getAcutinType() {
		return acutinType;
	}

	public void setAcutinType(String acutinType) {
		this.acutinType = acutinType;
	}

	public String getCustomer() {
		return customer;
	}

	public void setCustomer(String customer) {
		this.customer = customer;
	}
}
 

 

主程序(MainApp)

package observer;

/**
 * @author yingmu
 * @version 2011-3-16 下午05:29:40
 */
public class MainApp {

	public static void main(String[] args) {
		Shop shop = new Shop();

		// 添加摄像头1号
		Camera camera = new Camera(1);
		shop.addObserver(camera);

		// 添加门卫一号
		Guard guard1 = new Guard("门卫一号");
		shop.addObserver(guard1);

		// 来访登记、出门登记
		shop.comeIn("BlogJava");
		shop.comeIn("JavaEye");
		shop.getOut("BlogJava");

		// 移除门卫一号,上厕所去了
		shop.deleteObserver(guard1);
		System.out.println(guard1.toString() + "上厕所去了");

		// 进入无人观察状态,随进随出
		shop.comeIn("CSDN");
		shop.getOut("JavaEye");
		shop.comeIn("樱木");

		// 添加门卫二号
		Guard guard2 = new Guard("门卫二号");
		shop.addObserver(guard2);

		// 来访登记,出门登记
		shop.comeIn("MS");
		shop.getOut("CSDN");
	}
}

 

 

运行结果:

保安门卫一号汇报:BlogJava进入商店
摄像头1号,监控到1个人进入商店,当前店内有1个人
保安门卫一号汇报:JavaEye进入商店
摄像头1号,监控到1个人进入商店,当前店内有2个人
保安门卫一号汇报:BlogJava离开商店
摄像头1号,监控到个人离开商店,当前店内有1个人
门卫一号上厕所去了
摄像头1号,监控到1个人进入商店,当前店内有2个人
摄像头1号,监控到个人离开商店,当前店内有1个人
摄像头1号,监控到1个人进入商店,当前店内有2个人
保安门卫二号汇报:MS进入商店
摄像头1号,监控到1个人进入商店,当前店内有3个人
保安门卫二号汇报:CSDN离开商店
摄像头1号,监控到个人离开商店,当前店内有2个人
1
3
分享到:
评论

相关推荐

    ObserverPattern

    4. **具体观察者(Concrete Observer)**:实现了观察者接口的类,它维护了一个与主题相关的状态,并在接收到主题的通知后更新自身的状态。 观察者模式的主要优点有: - **松耦合**:被观察者和观察者之间通过接口...

    设计模式之观察者模式(Observer Pattern)

    在"ObserverPattern(简单实现)1.rar"中,我们可以看到一个简单的观察者模式实现。主题类(Subject)通常包含一个添加、删除和通知观察者的接口。当主题状态改变时,它会调用`notifyObservers()`方法,将变化通知给...

    swift-Swiftµframework实现观察者模式Observerpattern

    Swift µframework 实现观察者模式Observer pattern

    matlab开发-Observerpattern

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的对象。在MATLAB中实现观察者模式,可以帮助我们构建灵活、可扩展的代码结构,特别是在...

    ObserverPattern.zip

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个例子中,李先生是观察者,他希望得到气象站的天气预报更新和旅行社的...

    Observer Pattern.rar

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

    Observer Pattern Example.rar

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

    OBserver模式设计实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...

    类似 Observer Pattern 的 NSNotificationCenter (实例)

    在iOS和macOS开发中,`NSNotificationCenter` 是一个关键的组件,它实现了一种类似于观察者模式(Observer Pattern)的机制。观察者模式是一种设计模式,它允许对象在状态变化时通知其他对象,而无需显式引用这些...

    com.designpattern.state_observer.rar

    在实现状态模式时,通常会有一个上下文类,它维护一个对当前状态对象的引用,并通过状态对象来执行行为。状态对象之间的切换通常是通过上下文类的方法实现的。 2. **观察者模式(Observer Pattern)**: 观察者...

    02-observer-pattern

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

    Observer HeadFirst design pattern

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

    Observer模式代码实现

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

    observer-pattern-demo 观察者模式示例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....

    组合模式 Composite Pattern

    **组合模式的关键在于定义了一个共同的接口**,这个接口被所有的叶子对象和组合对象实现。这意味着无论是处理单个对象还是组合对象,都可以使用相同的接口方法。此外,组合模式通常会包含以下组成部分: 1. **...

    python-observer-pattern:Python中的观察者模式-代码示例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。在Python中,我们可以利用内置的事件处理系统或者自定义类来实现这种模式。...

    observer-pattern:New's Station Observer Pattern演示

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,这种模式通常通过实现`java.util.Observable`接口和`java.util....

    观察者模式,Observer

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

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

Global site tag (gtag.js) - Google Analytics