题目:假设猫(Cat)是老鼠(Mouse)、猪(Pig)和狗(Dog)的观察目标, 老鼠、 猪和狗是观察者,猫叫老鼠跑,狗也跟着叫,猪没动静。使用观察者模式描述该过程。设计各个角色,画出UML类图,并编码实现之。
时间: 2024-12-10 11:49:07 浏览: 22
题目所描述的情况可以用观察者模式(Observer Pattern)来解决,这是一个行为设计模式,它定义了当主题(Subject)的状态发生改变时,所有依赖于它的观察者(Observers)都会得到通知并自动更新。
1. 角色定义:
- **主题 (Subject)**:猫,负责维护其状态(比如是否看到老鼠),以及通知观察者。
- **观察者 (Observer)**:老鼠、猪和狗,它们需要订阅猫的消息并做出相应的反应。
- **具体观察者 (Concrete Observers)**:鼠类、猪类和狗类,每个类有自己的行为。
2. UML 类图示例:
![UML 图片](https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Observable_and_Observers.svg/600px/Observable_and_Observers.svg.png)
在这个类图中,`Cat`是中心节点,连接着三个具体的观察者(`Mouse`, `Pig`, 和 `Dog`),它们通过`Observable`接口(未显示)关联。
3. 编码实现(伪代码或简单Java示例):
```java
// 主题 (Subject)
class Cat {
private List<Observer> observers;
void seeAnimal(String animalType) {
if (animalType.equals("mouse")) {
// 更新状态
notifyObservers(animalType);
}
}
void addObserver(Observer observer) {
observers.add(observer);
}
void removeObserver(Observer observer) {
observers.remove(observer);
}
protected void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
// 具体观察者
interface Observer {
void update(String message);
}
class Mouse implements Observer {
@Override
public void update(String message) {
if ("run".equals(message)) {
System.out.println("Mouse runs when cat sees a mouse.");
}
}
}
class Pig implements Observer {
@Override
public void update(String message) {
if ("no reaction".equals(message)) {
System.out.println("Pig doesn't react.");
}
}
}
class Dog implements Observer {
@Override
public void update(String message) {
if ("also calls".equals(message)) {
System.out.println("Dog also yells.");
}
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat();
Mouse mouse = new Mouse();
Pig pig = new Pig();
Dog dog = new Dog();
cat.addObserver(mouse);
cat.addObserver(pig);
cat.addObserver(dog);
cat.seeAnimal("mouse"); // 输出: Mouse runs when cat sees a mouse. Dog also yells.
}
}
```
阅读全文