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个人
分享到:
相关推荐
Swift µframework 实现观察者模式Observer pattern
head-first-design-pattern—02-observer-pattern(观察者模式),融入了个人的见解,里面包含错误的实现和正确的标准实现,你可以对比学习,加深对模式的理解
文章链接:https://blog.csdn.net/qq_44901285/article/details/116092808?spm=1001.2014.3001.5501 Spring事件机制(Event)-- 基于观察者模式实现多任务同时处理(源码)
Swift中微小但易于使用的Observer-Pattern实现 SteinsKit是一个框架,可帮助您在没有任何FRP概念的情况下实现观察者模式。 请注意,该框架尚未经过广泛测试,目前仅适用于iOS。 如果您有任何问题,更好的主意或您...
Observer Pattern的Prototype实现,其中参照了部分CEGUI的实现细节 使用cmake进行编译
主要介绍了C#观察者模式(Observer Pattern),主要以一个实例的形式讲述了C#观察者模式的实现过程,详细讲述了接口的定义、通知及动作的实现方法,需要的朋友可以参考下
观察者模式,实现了表示层和数据逻辑的分离。在观察目标和观察者之间建立一个抽象的耦合
主要介绍了JavaScript编程设计模式之观察者模式(Observer Pattern),简单说明了观察者模式的概念、原理并结合实例形式详细给出了观察者模式的相关实现与使用技巧,需要的朋友可以参考下
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
2.我想把C#中实现观察者模式的三个方案做一个总结,目前还没看到这样的总结 现在我们来假设这样的一个场景,并利用观察者模式实现需求: 未来智能家居进入了每家每户,每个家居都留有API供客户进行自定义整合,所以...
AbstractFactoryPattern AdapterPattern IBridgePattern IBuilderPattern ...ObserverPattern PrototypePattern ProxyPattern SingletonPattern StatePattern StrategyPattern TemplatePattern VisitorPattern
4.何时适用1)当一个抽象模型有两方面,其中一方面的操作依赖于另一方面的状态变化。可以封装成观察者模式,当目标对象的变化的时候,依赖于它的观察者也发生相应的变化,这样就把抽象模型的这两个方面分开了,使得...
Implementation of Template-based, type-safe and generic Observer Pattern for C++基于模板、类型安全、通用的观察者模式的C++实现;包含库文件和使用示例。
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
Maven项目生成一个可执行的.jar文件,键入以下命令: mvn clean package 。 要了解有关Maven Project的更多信息,您可以在5分钟内阅读maven。 ( )您的项目不应期望来自用户的任何输入,并且在通过以下命令编译时...