计算机中,消息是具有特定含义的数据
事件:能够激活对象功能的动作。当发生这种动作后将给所涉及对象发送一个消息,对象便可执行相应的功能
基于事件的软件体系结构(Event-Driven Architecture,EDA)是一种将系统设计为通过事件进行通信和协调的体系结构。在这种体系结构中,系统的各个组件通过发布和订阅事件的方式进行交互,以实现松耦合、可扩展和可维护的系统设计。
以下是一个简单的基于事件的软件体系结构的代码示例,以说明其工作原理:
// 事件发布者(Publisher)
public class EventPublisher {
private List<EventListener> listeners = new ArrayList<>();
public void addEventListener(EventListener listener) {
listeners.add(listener);
}
public void removeEventListener(EventListener listener) {
listeners.remove(listener);
}
public void publishEvent(Event event) {
for (EventListener listener : listeners) {
listener.handleEvent(event);
}
}
}
// 事件订阅者(Subscriber)
public interface EventListener {
void handleEvent(Event event);
}
// 事件定义
public class Event {
private String data;
public Event(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
// 事件处理器(Event Handler)
public class EventHandler implements EventListener {
@Override
public void handleEvent(Event event) {
String data = event.getData();
System.out.println("Event received: " + data);
// 进行事件处理逻辑
}
}
在上述代码示例中,EventPublisher
负责发布事件,它维护了一个事件监听器列表,并提供了添加、移除和发布事件的方法。EventListener
接口定义了事件订阅者的行为,其中的handleEvent
方法用于处理接收到的事件。Event
类表示事件对象,其中包含了事件的数据。
当事件发布者调用publishEvent
方法发布事件时,所有注册的事件监听器(订阅者)都会收到该事件并调用其handleEvent
方法进行处理。在示例中,EventHandler
实现了EventListener
接口,它的handleEvent
方法打印了接收到的事件数据,并执行了相应的事件处理逻辑。
基于事件的软件体系结构的优点包括:
总结而言,基于事件的软件体系结构通过事件的发布和订阅机制实现组件之间的通信和协调,具有松耦合、可扩展和可维护等优点。它适用于需要异步处理和松散耦合的系统设计,可以帮助构建灵活且具有良好扩展性的软件系统。
隐式调用将调用者与被调用者解耦,调用者可以不知道谁是被调用者。也不知道调用后的后果如何。
连接件:事件-过程绑定
过程<事件处理器,事件的接收和处理方>向特定的事件进行注册
构件<事件源>发布事件
当某些事件被发布时,向其注册的过程被隐式调用
调用的次序是不确定的
在某些情况下,一个事件也可能触发其他事件,形成事件链。
这种连接机制成为“事件—事件绑定”。
事件派遣模块
功能:负责接收到来的事件并派遣它们到其他模块
派遣方式:
1.广播式:派遣模块将事件广播到所有的模块,但只有感兴趣的模块才去取事件,并触发自身的行为
2.选择广播式:派遣模块将事件送到那些已经注册了的模块中
关于setChanged
分为两种情况
1.传统模式
在传统模式中,Observable是接口,方法是可以自己定义的,一般来说就三个方法,注册,取消注册,通知
2.Java API模式
在传统模式中,Observable是抽象类,setChanged是必须的,而且是用来设置一个 boolean 类型的内部标志位,注明目标对象发生了变化。当它为真时,notifyObservers() 才会通知观察者。一般来说,也是三个方法,注册,改变状态,通知
当调用Observable类的notifyObserver之前,还应该同时调用什么方法?
在调用Observable类的notifyObserver
方法之前,应该先调用setChanged
方法。
setChanged
方法是Observable类的一个方法,用于设置对象的状态已经改变。它会将Observable对象的changed
字段设置为true,表示对象的状态已经发生了改变。
在观察者模式中,当被观察对象的状态发生改变时,需要先调用setChanged
方法来标记状态已经改变,然后再调用notifyObserver
方法通知所有观察者。这样做的目的是确保只有当状态发生改变时才会通知观察者,避免不必要的通知。
因此,在调用notifyObserver
方法之前,应该先调用setChanged
方法来设置对象的状态已经改变。这样可以确保观察者能够正确地接收到状态改变的通知。
1、设计类图:
2、解释:
Observable和Observer为接口类,FishbowlGUI为被观察类(实现Observable接口),ChemistryGUI、TemperatureGUI、LevelGUI为观察者类(实现Observer接口)。
FishbowlGUI有3个私有变量quality、temperature和level,分别代表鱼缸的水质、水温和水位高度,每个私有变量都有其对应的get和set方法。
三个观察者类都要实现takeAction(Observable s)方法,每个类实现该方法的方式不同:
该方法通过参数传入一个被观察者对象,当得到通知后,将对被观察者类FishbowlGUI的某些方法进行调用,以便获取变化的状态。
1、设计类图:
2、AirportInfo类三个方法的功能:
3、update方法的参数:
4、具体行为:
5、工作原理: