9.观察者模式
1.观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式。观察者模式在目标与观察者之间建立一套触发体系,并降低了两者耦合关系,但是这个耦合关系并没有完全解除。观察者模式最经典的案例就是MQ的实现,各种MQ都使用了类似的模式。
2.观察者模式的主要参与对象有:
(1)抽象的观察者(定义取得通知的办法)
(2)实际观察者
(3)抽象的目标,即观察主题(定义添加和移除观察者的办法,自身改变通知观察者的办法)
(4)实际的主题
3.案例
具体场景是:观察者是三个屌丝,主题是一个美女,三个屌丝同为备胎,他们关注的目标为美女,某一天美女无聊,群发的一个消息给三个备胎。
4.实现
package com.java.dp.observe; /** * @Author lizhilong * @create 2019/12/10 17:51 * @desc 抽象的观察者 */ public interface Observer { void update(String message); }
package com.java.dp.observe; /** * @Author lizhilong * @create 2019/12/10 17:53 * @desc 抽象的观察者的实现 */ public class ObserverImpl implements Observer { private String name; public ObserverImpl(String name) { this.name = name; } @Override public void update(String message) { System.out.println("【" + name + "】" + "收到了:" + message); } }
package com.java.dp.observe; import java.util.ArrayList; import java.util.List; /** * @Author lizhilong * @create 2019/12/10 17:56 * @desc 定义抽象的观察主题 */ public abstract class Subject { protected List<Observer> observers = new ArrayList<>(); public void addObserver(Observer observer){ observers.add(observer); } public void removeObserver(Observer observer){ observers.remove(observer); } public abstract void notify(String message); }
package com.java.dp.observe; /** * @Author lizhilong * @create 2019/12/10 18:01 * @desc 观察主题实现 */ public class GirlSubject extends Subject { @Override public void notify(String message) { observers.forEach(e -> e.update(message)); } }
package com.java.dp.observe; /** * @Author lizhilong * @create 2019/12/10 18:05 * @desc */ public class ObserverClient { public static void main(String[] args) { Observer observer1 = new ObserverImpl("备胎一号"); Observer observer2 = new ObserverImpl("备胎二号"); Observer observer3 = new ObserverImpl("备胎三号"); Subject gril = new GirlSubject(); gril.addObserver(observer1); gril.addObserver(observer2); gril.addObserver(observer3); gril.notify("小哥哥,今天晚上我有空,陪我去看电影!"); } }
运行结果:
【备胎一号】收到了:小哥哥,今天晚上我有空,陪我去看电影!
【备胎二号】收到了:小哥哥,今天晚上我有空,陪我去看电影!
【备胎三号】收到了:小哥哥,今天晚上我有空,陪我去看电影!
对于这个结果,我只能说,卧槽,无情,舔狗必死!!