如何实现单目事件?即,事件最多只传递给一个事件目标,请用Java代码写一个事件监听模式的例子,要求对事件的监听者只能有一个
时间: 2024-03-01 12:49:34 浏览: 113
关于JAVA中事件分发和监听机制实现的代码实例
4星 · 用户满意度95%
实现单目事件并限制监听者数量的方法是使用观察者模式。观察者模式是一种常见的设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
下面是一个使用观察者模式实现单目事件且限制监听者数量的 Java 代码示例:
```java
import java.util.ArrayList;
import java.util.List;
interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers(Object event);
}
interface Observer {
void update(Object event);
}
class EventSource implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
private Object event;
public void attach(Observer observer) {
if (observers.size() == 0) {
observers.add(observer);
} else {
throw new RuntimeException("Only one listener allowed");
}
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(Object event) {
this.event = event;
for (Observer observer : observers) {
observer.update(event);
}
}
public void setEvent(Object event) {
notifyObservers(event);
}
}
class EventListener implements Observer {
public void update(Object event) {
System.out.println("Event received: " + event);
}
}
public class SingleTargetEventExample {
public static void main(String[] args) {
EventSource eventSource = new EventSource();
EventListener listener1 = new EventListener();
EventListener listener2 = new EventListener();
eventSource.attach(listener1);
// eventSource.attach(listener2); // Exception: Only one listener allowed
eventSource.setEvent("Event 1");
eventSource.detach(listener1);
eventSource.attach(listener2);
eventSource.setEvent("Event 2");
}
}
```
在上面的示例中,我们定义了一个 `Subject` 接口和一个 `Observer` 接口,分别表示事件源和事件监听者。`EventSource` 类实现了 `Subject` 接口,并通过 `attach` 和 `detach` 方法来管理监听者,同时通过 `notifyObservers` 方法通知监听者。在 `attach` 方法中,我们通过判断 `observers` 列表的大小来限制监听者数量,如果已经有一个监听者了,则抛出异常。`EventListener` 类实现了 `Observer` 接口,并在 `update` 方法中处理事件。
在 `main` 方法中,我们创建了一个 `EventSource` 对象和两个 `EventListener` 对象。通过 `attach` 方法将 `listener1` 注册为监听者,再次调用 `attach` 方法时会抛出异常。接着,调用 `setEvent` 方法触发事件,并通过 `detach` 方法移除 `listener1` 监听器。最后,再次调用 `attach` 方法将 `listener2` 注册为监听器,并再次调用 `setEvent` 方法触发事件,此时只有 `listener2` 能够接收到事件。
阅读全文