`
ilovejavaforever
  • 浏览: 163274 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    02-observer-pattern

    head-first-design-pattern—02-observer-pattern(观察者模式),融入了个人的见解,里面包含错误的实现和正确的标准实现,你可以对比学习,加深对模式的理解

    observer-pattern.rar

    文章链接:https://blog.csdn.net/qq_44901285/article/details/116092808?spm=1001.2014.3001.5501 Spring事件机制(Event)-- 基于观察者模式实现多任务同时处理(源码)

    SteinsKit:Swift中一个微小但易于使用的Observer-Pattern实现

    Swift中微小但易于使用的Observer-Pattern实现 SteinsKit是一个框架,可帮助您在没有任何FRP概念的情况下实现观察者模式。 请注意,该框架尚未经过广泛测试,目前仅适用于iOS。 如果您有任何问题,更好的主意或您...

    ObserverPatternTest

    Observer Pattern的Prototype实现,其中参照了部分CEGUI的实现细节 使用cmake进行编译

    C#观察者模式(Observer Pattern)实例教程

    主要介绍了C#观察者模式(Observer Pattern),主要以一个实例的形式讲述了C#观察者模式的实现过程,详细讲述了接口的定义、通知及动作的实现方法,需要的朋友可以参考下

    observer_JavaDesignPattern_

    观察者模式,实现了表示层和数据逻辑的分离。在观察目标和观察者之间建立一个抽象的耦合

    JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解

    主要介绍了JavaScript编程设计模式之观察者模式(Observer Pattern),简单说明了观察者模式的概念、原理并结合实例形式详细给出了观察者模式的相关实现与使用技巧,需要的朋友可以参考下

    design-pattern-java.pdf

    撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...

    java观察者模式.doc

    在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...

    用Java实现23种设计模式

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...

    观察者模式(Observer)原理图

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

    C#中观察者模式的3种实现方式

    2.我想把C#中实现观察者模式的三个方案做一个总结,目前还没看到这样的总结 现在我们来假设这样的一个场景,并利用观察者模式实现需求: 未来智能家居进入了每家每户,每个家居都留有API供客户进行自定义整合,所以...

    常用设计模式的IOS实现源码打包下载

    AbstractFactoryPattern AdapterPattern IBridgePattern IBuilderPattern ...ObserverPattern PrototypePattern ProxyPattern SingletonPattern StatePattern StrategyPattern TemplatePattern VisitorPattern

    java_pattern_observer:23个java模式

    4.何时适用1)当一个抽象模型有两方面,其中一方面的操作依赖于另一方面的状态变化。可以封装成观察者模式,当目标对象的变化的时候,依赖于它的观察者也发生相应的变化,这样就把抽象模型的这两个方面分开了,使得...

    基于模板、类型安全、通用的观察者模式的C++实现

    Implementation of Template-based, type-safe and generic Observer Pattern for C++基于模板、类型安全、通用的观察者模式的C++实现;包含库文件和使用示例。

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    Observer-Design-Pattern

    Maven项目生成一个可执行的.jar文件,键入以下命令: mvn clean package 。 要了解有关Maven Project的更多信息,您可以在5分钟内阅读maven。 ( )您的项目不应期望来自用户的任何输入,并且在通过以下命令编译时...

Global site tag (gtag.js) - Google Analytics