观察者模式
1.观察者模式原理
观察者模式定义:简单地说,观察者定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象,这样一个主题对象在状态的变化就能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
2.观察者模式实现:
- 具体被观察者接口:
package com.lili.observer; /** * 被观察者接口 * * @author: QiJingJing * @create: 2021/7/18 */ public interface MessageSubject { /** * 注册观察者 */ void registerObserver(Observer o); /** * 移除观察者 */ void removeObserver(Observer o); /** * 通知所有观察者 */ void notifyObservers(); }
- 具体观察者接口:
package com.lili.observer; /** * 观察者接口 * * @author: QiJingJing * @create: 2021/7/18 */ public interface Observer { /** * 更新消息 */ public void update(String message); }
- 被观察者实现:
package com.lili.observer; import java.util.ArrayList; import java.util.List; /** * 具体的被观察者对象 * * @author: QiJingJing * @create: 2021/7/18 */ public class Message implements MessageSubject { // 维护的观察者列表 private List<Observer> list = new ArrayList<>(); private String message; public void setMessage(String message) { this.message = message; notifyObservers(); } @Override public void registerObserver(Observer o) { list.add(o); } @Override public void removeObserver(Observer o) { list.remove(o); } @Override public void notifyObservers() { for (Observer observer : list) { observer.update(message); } } }
- 观察者实现:
package com.lili.observer; /** * 具体的被观察者对象 * * @author: QiJingJing * @create: 2021/7/18 */ public class User implements Observer { private String name; public User(String name) { this.name = name; } @Override public void update(String message) { System.out.println("[" + name + "]" + "收到消息:" + message); } }
- 测试代码:
package com.lili.observer; /** * @author: QiJingJing * @create: 2021/7/18 */ public class Test { @org.junit.Test public void testObserver() { // 创建一个被观察者对象 Message message = new Message(); // 创建三个观察者对象 Observer user1 = new User("lili"); Observer user2 = new User("tom"); Observer user3 = new User("vice"); message.registerObserver(user1); message.registerObserver(user2); message.registerObserver(user3); // 发出消息 message.setMessage("亲们,么么哒"); } }
运行结果:
[lili]收到消息:亲们,么么哒 [tom]收到消息:亲们,么么哒 [vice]收到消息:亲们,么么哒