观察者模式

xiaoxiao2021-02-27  210

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 摘自搜狗百科 《观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。 面向对象设计 的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。 package com.tiger.observer; /** * * Message -- 被观察者接口 * @author tiger * */ public interface Message { //注册入一个观察者 public void register(Observer observer); //移除某位观察者 public void remove(Observer observer); //通知所有观察者 public void notifyObservers(String msg); } package com.tiger.observer; import java.util.ArrayList; import java.util.List; /** * 消息的实现类 被观察者 * @author tiger * */ public class MessageImpl implements Message{ //观察者集合 List observers = new ArrayList<>(); /** * 注册观察者 */ @Override public void register(Observer observer) { observers.add(observer); } /** * 移除观察者 */ @Override public void remove(Observer observer) { observers.remove(observer); } /** * 通知所有观察者 */ @Override public void notifyObservers(String msg) { for (Observer observer : observers) { observer.update(msg); } } } package com.tiger.observer; /** * [观察者] 接口 * @author tiger */ public interface Observer { public void update(String msg); } package com.tiger.observer; /** * ObserverImpl -- 察者的实现类 * @author tiger * */ public class ObserverImpl implements Observer{ //实现类的姓名 String name; @Override public void update(String msg) { System.out.println(this.name+ " 收到 " + msg); } public ObserverImpl(String name) { this.name = name; } } package com.tiger.observer; /** * 测试类 * @author tiger */ public class ObserverTest { public static void main(String[] args) { Message msg = new MessageImpl(); //注册观察者 Observer observer1 = new ObserverImpl("彩兰"); Observer observer2 = new ObserverImpl("小红"); msg.register(observer1); msg.register(observer2); System.out.println("--- 第一次通知 ---"); msg.notifyObservers("今天要加班"); //移除观察者 msg.remove(observer1); System.out.println("--- 最终通知 ---"); //消息发布 msg.notifyObservers("今天要加班"); } }
转载请注明原文地址: https://www.6miu.com/read-11669.html

最新回复(0)