设计模式(七)观察者模式

观察者模式

解释

多个观察者,等待被观察者触发某个状态,触发则通知观察者,进行处理

代码维度

举例

小朋友哭了要喂吃的…

    V1 while循环观察等待 V2 抽象小朋友对象,根据表示符号判断 V3 抽象观察者,根据情况调用观察者 class Child { private boolean cry = false; private Dad d = new Dad(); public boolean isCry() { return cry; } public void wakeUp() { cry = true; d.feed(); } } V4 加入多个观察者 class Child { private boolean cry = false; private Dad dad = new Dad(); private Mum mum = new Mum(); private Dog dog = new Dog(); public boolean isCry() { return cry; } public void wakeUp() { cry = true; dad.feed(); dog.wang(); mum.hug(); } } V5 抽象观察者接口 被观察者内部通过list存储所有观察者,满足条件时通知所有观察者 class Child { private boolean cry = false; private List<Observer> observers = new ArrayList<>(); { observers.add(new Dad()); observers.add(new Mum()); observers.add(new Dog()); } public boolean isCry() { return cry; } public void wakeUp() { cry = true; for(Observer o : observers) { o.actionOnWakeUp(); } } } V6 实际应用中,一般定义一种事件,满足条件被观察者发出这个事件,观察者根据自己的逻辑对事件进行处理。 主要是因为观察者根据被观察者的状态需要有不同的处理 如:小朋友醒来(夜里、白天、床上、床下…) class Child { private boolean cry = false; private List<Observer> observers = new ArrayList<>(); { observers.add(new Dad()); observers.add(new Mum()); observers.add(new Dog()); } public boolean isCry() { return cry; } public void wakeUp() { cry = true; wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed"); for(Observer o : observers) { o.actionOnWakeUp(event); } } } //事件类 fire Event class wakeUpEvent{ long timestamp; String loc; public wakeUpEvent(long timestamp, String loc) { this.timestamp = timestamp; this.loc = loc; } } V7 观察者可以观察多个被观察者,所以需要在事件中添加事件源头参数 class wakeUpEvent{ long timestamp; String loc; Child source; public wakeUpEvent(long timestamp, String loc, Child source) { this.timestamp = timestamp; this.loc = loc; this.source = source; } } V8 事件添加继承体系 abstract class Event<T> { abstract T getSource(); } class wakeUpEvent extends Event<Child>{ long timestamp; String loc; Child source; public wakeUpEvent(long timestamp, String loc, Child source) { this.timestamp = timestamp; this.loc = loc; this.source = source; } @Override Child getSource() { return source; } }

知识点

观察者模式通常可以跟责任链模式结合使用

多个观察者可以看作一个链路,通知多个观察者即可以理解为依次执行责任链路

钩子函数、callback、hook、listener其实都是观察者模式

经验分享 程序员 微信小程序 职场和发展