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个人
分享到:
相关推荐
4. **具体观察者(Concrete Observer)**:实现了观察者接口的类,它维护了一个与主题相关的状态,并在接收到主题的通知后更新自身的状态。 观察者模式的主要优点有: - **松耦合**:被观察者和观察者之间通过接口...
在"ObserverPattern(简单实现)1.rar"中,我们可以看到一个简单的观察者模式实现。主题类(Subject)通常包含一个添加、删除和通知观察者的接口。当主题状态改变时,它会调用`notifyObservers()`方法,将变化通知给...
Swift µframework 实现观察者模式Observer pattern
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的对象。在MATLAB中实现观察者模式,可以帮助我们构建灵活、可扩展的代码结构,特别是在...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个例子中,李先生是观察者,他希望得到气象站的天气预报更新和旅行社的...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的系统...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,其主要思想是定义一个一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中,尤其是...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java和C++等面向对象编程语言中,这种模式广泛用于事件处理和实时系统,...
在iOS和macOS开发中,`NSNotificationCenter` 是一个关键的组件,它实现了一种类似于观察者模式(Observer Pattern)的机制。观察者模式是一种设计模式,它允许对象在状态变化时通知其他对象,而无需显式引用这些...
在实现状态模式时,通常会有一个上下文类,它维护一个对当前状态对象的引用,并通过状态对象来执行行为。状态对象之间的切换通常是通过上下文类的方法实现的。 2. **观察者模式(Observer Pattern)**: 观察者...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件驱动编程,例如用户...
观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在C++中有着广泛的应用,...
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件处理系统。 #### 核心...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....
**组合模式的关键在于定义了一个共同的接口**,这个接口被所有的叶子对象和组合对象实现。这意味着无论是处理单个对象还是组合对象,都可以使用相同的接口方法。此外,组合模式通常会包含以下组成部分: 1. **...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。在Python中,我们可以利用内置的事件处理系统或者自定义类来实现这种模式。...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,这种模式通常通过实现`java.util.Observable`接口和`java.util....
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...