本文共 1822 字,大约阅读时间需要 6 分钟。
定义
对象之间一对多的依赖关系,当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。 观察者模式有两个角色 1、Subject 观察主题对象,也可以叫被观察或者被订阅对象 2、Observer 观察者或订阅者对象,当Subject有变动,就会通知到每一个Observer 【Subject(被观察者):被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。 ConcreteSubject:被观察者的具体实现。包含一些基本的属性状态及其他操作。Observer(观察者):接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver: 观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。】 应用 MVC模型-视图-控制框架也使用观察者模式,把模型当做被观察者,视图视为观察者。视图能够注册自己到模型上来获得模型的改变。/** * 观察者主题对象 * @author lu * @since 1.0, 2020年6月24日 */public interface Subject { //订阅操作 void attach(Observer observer); //取消订阅操作 void detach(Observer observer); //通知变动 void notifyChanged(); }
/** * 观察者订阅人对象 * @author lu * @since 1.0, 2020年6月24日 */public interface Observer { //接收变动通知 void update();}
/** * 观察者主题对象Subject实例化 * @author lu * @since 1.0, 2020年6月24日 */public class RealSubject implements Subject{ private ListobserverList = new ArrayList<>(); @Override public void attach(Observer observer) { observerList.add(observer); } @Override public void detach(Observer observer) { observerList.remove(observer); } @Override public void notifyChanged() { for (Observer observer : observerList) { observer.update(); } } }
/** * 观察者订阅人对象实现类 * @author lu * @since 1.0, 2020年6月24日 */public class RealObject implements Observer{ @Override public void update() { System.out.println("接收到了信息"); } }
/** * 测试 * @author lu * @since 1.0, 2020年6月24日 */public class Client { public static void main(String[] args) { Subject subject = new RealSubject(); Observer observier = new RealObject(); subject.attach(observier); subject.notifyChanged(); }}
运行结果:
转载地址:http://qqbez.baihongyu.com/