观察者模式
定义
定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式是行为型模式之一。包含观察者模式包括观察者与被观察者两个基本元素,观察者会注册到被观察者中,而被观察者会保持和观察者的对应关系。
如果被观察的对象产生一些观察者感兴趣的变更,则观察者会得到通知从而去执行相关的操作。
常见的观察者模式
提到观察者模式,首先会想到前端中常用的事件机制。例如为dom元素绑定事件:
$(document).click(function (e) { console.dir(e); });
这里的匿名function就是观察者,而document则是被观察者,.click(function)则是观察者注册的过程,此后document发生click事件时,被观察者则会收到通知,从而执行自己的逻辑console.dir(e)。
使用观察者模式
现在我们使用Java来模拟观察者模式。
先创建事件,包含事件源,通知目标,回调方法以及触发者等属性。
/** * 事件 */ public class Event { private Object source; // 事件源 private Object target; // 通知目标 private Method callback; // 回调方法名称 private String trigger; // 触发者 private long time; public Event(Object target, Method callback) { this.target = target; this.callback = callback; } // 省略getter、setter }
定义事件类型,此处定义添加、删除两种类型。
/** * 事件类型 */ public enum EventType { /** * 添加 */ ADD, /** * 删除 */ RMOVE }
定义抽象被观察者(主题),包含主题名称,保持与观察者引用映射的容器,以及事件触发的方法。
import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /** * 抽象主题 * 定义主题通用的容器、事件注册及事件触发 */ public class AbstractSubject { protected String name; protected Map<Enum,Event> eventMap = new HashMap<>(); // 注册容器 public AbstractSubject() {} protected AbstractSubject(String name) { this.name = name; } /** * 事件注册 * @param eventType * @param target * @param callback */ public void addLisenter(Enum eventType, Object target, Method callback) { eventMap.put(eventType, new Event(target, callback)); } /** * 事件触发 * @param eventType */ protected void trigger(Enum eventType) { Event event = this.eventMap.get(eventType); if(null == event) { return; } event.setSource(this); event.setTrigger(eventType.toString()); event.setTime(System.currentTimeMillis()); try { event.getCallback().invoke(event.getTarget(), event); } catch (Exception e1) { e1.printStackTrace(); } } // 省略getter、setter }
定义具体主题:
/** * 主题,被观察者 */ public class Subject extends AbstractSubject { public Subject(String name) { super.name = name; } public void add() { trigger(EventType.ADD); } public void remove() { trigger(EventType.RMOVE); } }
定义观察者,包含添加、删除事件对应的回调方法。
/** * 观察者 */ public class Observer { public void onAdd(Event event) { System.out.println("收到" + event.getTrigger() + "的添加事件"); } public void onRemove(Event event) { System.out.println("收到" + event.getTrigger() + "的删除事件"); } }
测试类:
/** * 测试类 */ public class Test { public static void main(String[] args) throws NoSuchMethodException { // 观察者 Observer observer = new Observer(); // 观察者收到通知后执行的方法 Method onAdd = Observer.class.getMethod("onAdd", Event.class); Method onRemove = Observer.class.getMethod("onRemove", Event.class); // 被观察者 Subject subject = new Subject("目标1号"); // 事件绑定 subject.addLisenter(EventType.ADD, observer, onAdd); subject.addLisenter(EventType.RMOVE, observer, onRemove); // 被观察者触发事件 subject.add(); subject.remove(); } }
其中,得到观察者和主题对象后,进行观察者的注册,然后主题执行动作触发事件,这是整个流程。
如果需要做成主题和观察者一对多的映射,则将Event的target改成集合类型,如下:
private List<Object> targets; // 通知目标
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
世界五大黑客:代码创造他们,他们改变世界!
黑客,这一词汇现在被整个社会所广泛流传,指借那些利用计算机实行犯罪活动的邪恶人士——但要是意识到现在技术业界中的众多领导者都是以黑客做为其入门跳板,大家是不是会感到甚为意外? 同样骇人听闻的是,其中极少数天才在过去十余年中早已快速掘起,并彻底改变了我们对于技术工具的采用方法。 不论是技术领导者還是毫不起眼的参于人员,的确有相当一小部分颇为睿智的大脑受过黑客思维方式的启迪而最后迈向人生的高潮。黑客思维方式绝不仅象征着计算机犯罪或是技术滥用,其更多是某种针对目前規則及枷锁的攻克。黑客思维方式关注的是将技术推向新的坡度,同时开发、開放以及编写代碼,进而创造出各色令人震惊的工具或网站。顶级黑客思维方式的中心思想关键在于通过共享信息构建更为美好幸福的世界。总结来说,黑客思维方式的真正含意远过错超过了其字意表述。 必须注重的是,并非是每个黑客都属于恶意人士,其中相当一部分参加者致力构建创新并幫助我们保卫全世界安全。在今天的文章中,我们将共同结识五位改变了世界的伟大黑客。 NO.5. 阿兰·图灵 大家耳熟能详但却很少将其与“黑客”二字挂钩的大名正是图灵,他的全名为阿兰·图灵,也是计算技术真正出现之前...
- 下一篇
Centos安装gerrit
centos安装与配置gerrit 参考链接:https://www.rosehosting.com/blog/how-to-install-gerrit2-on-a-centos-7-linux-vps/ 1. 安装java 下载jdk: yum install ./jdk-8u201-linux-x64.rpm 执行: JDK_DIRS=($(ls -d /usr/java/jdk*)) JDK_VER=${JDK_DIRS[@]:(-1)} alternatives --install /usr/bin/java java /usr/java/"${JDK_VER##*/}"/jre/bin/java 20000 alternatives --install /usr/bin/jar jar /usr/java/"${JDK_VER##*/}"/bin/jar 20000 alternatives --install /usr/bin/javac javac /usr/java/"${JDK_VER##*/}"/bin/javac 20000 alternatives --ins...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8编译安装MySQL8.0.19