参考答案
一、观察者模式中的几种角色
- Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象;
- ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知;
- Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己;
- ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
二、观察者模式的实现
1. 定义观察者(消息接收方)
/\* \* 观察者(消息接收方) \*/ interface Observer { public void update(String message); } /\* \* 具体的观察者(消息接收方) \*/ class ConcrereObserver implements Observer { private String name; public ConcrereObserver(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + ":" + message); } }
2. 定义被观察者(消息发送方)
/\* \* 被观察者(消息发布方) \*/ interface Subject { // 增加订阅者 public void attach(Observer observer); // 删除订阅者 public void detach(Observer observer); // 通知订阅者更新消息 public void notify(String message); } /\* \* 具体被观察者(消息发布方) \*/ class ConcreteSubject implements Subject { // 订阅者列表(存储信息) private List<Observer> list = new ArrayList<Observer>(); @Override public void attach(Observer observer) { list.add(observer); } @Override public void detach(Observer observer) { list.remove(observer); } @Override public void notify(String message) { for (Observer observer : list) { observer.update(message); } } }
3. 代码调用
public class ObserverTest { public static void main(String[] args) { // 定义发布者 ConcreteSubject concreteSubject = new ConcreteSubject(); // 定义订阅者 ConcrereObserver concrereObserver = new ConcrereObserver("题花"); ConcrereObserver concrereObserver2 = new ConcrereObserver("Java"); // 添加订阅 concreteSubject.attach(concrereObserver); concreteSubject.attach(concrereObserver2); // 发布信息 concreteSubject.notify("更新了"); } }
结果:
题花:更新了 Java:更新了
以上,是Java面试题【观察者模式如何实现】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—