使用观察者模式,实现如下业务场景,一栋3层的楼房,每层有一个保安,负责本楼层的相
时间: 2023-09-18 08:15:54 浏览: 182
应安全工作。现在需要实现一个系统,当某一层楼的保安发生异常情况时,其他楼层的保安可以收到通知。
首先,我们需要定义一个抽象观察者(Observer)类,其中包含一个抽象方法,用于接收通知:
```java
public abstract class Observer {
protected Security security;
public abstract void update();
}
```
然后,我们定义一个具体的观察者(ConcreteObserver)类,用于实现抽象观察者中的方法:
```java
public class ConcreteObserver extends Observer {
public ConcreteObserver(Security security) {
this.security = security;
this.security.attach(this);
}
@Override
public void update() {
System.out.println("收到来自" + security.getFloor() + "楼的异常通知!");
}
}
```
在具体观察者中,我们重写了抽象观察者中的方法,在收到通知时打印出对应的楼层信息。
接下来,我们定义一个抽象主题(Subject)类,其中包含了添加、删除和通知观察者的方法:
```java
public abstract class Subject {
protected List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
```
最后,我们定义一个具体主题(ConcreteSubject)类,用于实现抽象主题中的方法,并在保安发生异常时通知其他保安:
```java
public class ConcreteSubject extends Subject {
private int floor;
public void setFloor(int floor) {
this.floor = floor;
}
public void abnormal() {
System.out.println(floor + "楼保安发生异常!");
notifyObservers();
}
}
```
在具体主题中,我们定义了一个楼层信息和一个异常通知方法,在通知方法中调用了抽象主题中的通知方法,将异常通知发送给所有观察者。
现在,我们可以使用观察者模式来实现楼层保安的异常通知功能了:
```java
public class ObserverPatternDemo {
public static void main(String[] args) {
ConcreteSubject subject1 = new ConcreteSubject();
ConcreteSubject subject2 = new ConcreteSubject();
ConcreteSubject subject3 = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver(new Security(subject1, 1));
ConcreteObserver observer2 = new ConcreteObserver(new Security(subject2, 2));
ConcreteObserver observer3 = new ConcreteObserver(new Security(subject3, 3));
subject1.abnormal(); // 1楼保安发生异常
subject2.abnormal(); // 2楼保安发生异常
subject3.abnormal(); // 3楼保安发生异常
}
}
```
在主函数中,我们创建了三个具体主题和三个具体观察者,将它们联系在一起,并在保安发生异常时调用对应主题的异常通知方法。运行程序后,我们可以看到输出的异常通知信息:
```
1楼保安发生异常!
收到来自1楼的异常通知!
2楼保安发生异常!
收到来自2楼的异常通知!
3楼保安发生异常!
收到来自3楼的异常通知!
```
阅读全文