博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——观察者模式
阅读量:5872 次
发布时间:2019-06-19

本文共 2723 字,大约阅读时间需要 9 分钟。

观察者(发布订阅)模式_发送状态变化通知给所有关注的对象

/** * @author maikec * @date 2019/5/15 */public abstract class AbstractSubject {    protected Queue
observerQueue; /** * 添加观察者 * @param observer */ public final void addObserver(AbstractObserver observer){ if (null == observerQueue){ ReentrantReadWriteLock.WriteLock writeLock = new ReentrantReadWriteLock().writeLock(); try { if (writeLock.tryLock()){ if (null == observerQueue){ observerQueue = new PriorityQueue<>( ); } } }finally { writeLock.unlock(); } } ReentrantReadWriteLock.WriteLock writeLock = new ReentrantReadWriteLock().writeLock(); try { if (writeLock.tryLock()){ observerQueue.add( observer ); } }finally { writeLock.unlock(); } } public final void remove(AbstractObserver observer){ Assert.notNull( observerQueue,"观察者列表未初始化" ); Assert.notNull( observer,"入参不能为null" ); ReentrantReadWriteLock.WriteLock writeLock = new ReentrantReadWriteLock().writeLock(); try { if (writeLock.tryLock()){ observerQueue.remove( observer ); } }finally { writeLock.unlock(); } } public final void notifyObservers(){ observerQueue.forEach( observer -> observer.update( this ) ); } /** * 获取主题状态 * @return */ public abstract String getSubjectStatus();}/** * @author maikec * @date 2019/5/15 */public abstract class AbstractObserver { /** * 观察AbstractSubject状态变化 * @param subject */ protected abstract void update(AbstractSubject subject);}/** * @author maikec * @date 2019/5/15 */public class ConcreteSubject extends AbstractSubject { @Setter private String status; @Override public String getSubjectStatus() { return status; }}/** * @author maikec * @date 2019/5/15 */public class ConcreteObserver extends AbstractObserver { @Override protected void update(AbstractSubject subject) { System.out.println( subject.getSubjectStatus() ); }}** * @author maikec * @date 2019/5/15 */public class ObserverDemo { public static void main(String[] args) { ConcreteSubject concreteSubject = new ConcreteSubject(); concreteSubject.setStatus( "Active" ); concreteSubject.addObserver( new ConcreteObserver() ); concreteSubject.notifyObservers(); concreteSubject.setStatus( "Down" ); concreteSubject.notifyObservers(); }}复制代码

附录

个人GitHub设计模式案例

声明

引用该文档请注明出处

转载于:https://juejin.im/post/5ce8e340f265da1bb96fb8cc

你可能感兴趣的文章
总有几位老师让你一生感激不尽----我的大学老师
查看>>
Lintcode: Update Bits
查看>>
深入理解JVM--类的执行机制
查看>>
0c-38-ARC快速入门
查看>>
CSS中margin和padding的区别
查看>>
Clojure学习02:语法
查看>>
docker安装hadoop
查看>>
URL安全的Base64编码
查看>>
安装Node和NPM
查看>>
随便说说removeFromSuperview方法
查看>>
【转载】Ogre的内存分配策略
查看>>
Linux设备模型(9)_device resource management ---devm申请空间【转】
查看>>
解决eclipse中出现Resource is out of sync with the file system问题
查看>>
Java学习——对象和类
查看>>
Atitit.php nginx页面空白 并返回500的解决
查看>>
struts2 OGNL表达式
查看>>
Andriod使用webview控件往APP里内嵌网页
查看>>
二级菜单不同方法的实现
查看>>
第五章 mybatis批量更新update
查看>>
pacific-atlantic-water-flow(不错)
查看>>