首页 / 设计模式 / 设计模式九 观察者模式
设计模式九 观察者模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式九 观察者模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2859字,纯文字阅读大概需要5分钟。
内容图文
0、基本定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
发布者/订阅者模式。
事件监听、swing中都有用到。
1、代码实战
时间核心类
/** * 事件 * @author zzf * @date 2018/9/2 15:30. */ public class Event { // source private Object source; // target private Object target; // callback private Method callback; // 触发事件 private String trigger; private long timestamp; public Event(Object target, Method callback) { this.target = target; this.callback = callback; } publiclong getTimestamp() { return timestamp; } publicvoid setTimestamp(long timestamp) { this.timestamp = timestamp; } public Object getTarget() { return target; } publicvoid setTarget(Object target) { this.target = target; } public Method getCallback() { return callback; } publicvoid setCallback(Method callback) { this.callback = callback; } public Object getSource() { return source; } publicvoid setSource(Object source) { this.source = source; } public String getTrigger() { return trigger; } Event setTrigger(String trigger) { this.trigger = trigger; returnthis; } @Override public String toString() { return "Event{" + "source=" + source + ", target=" + target + ", callback=" + callback + ", trigger=‘" + trigger + ‘\‘‘ + ‘}‘; } }
public class EventListener { // 相当注册器 protected Map<Enum, Event> events = new HashMap<>(); publicvoid addListener(Enum eventType, Object taget, Method callback) { //注册事件 //反射调用 events.put(eventType, new Event(taget, callback)); } privatevoid trigger(Event e) { e.setSource(this); e.setTimestamp(System.currentTimeMillis()); try { e.getCallback().invoke(e.getTarget(), e); } catch (Exception e1) { } } protectedvoid trigger(Enum call) { if (!this.events.containsKey(call)) { return; } trigger(this.events.get(call).setTrigger(call.toString())); } }
观察者
/** * 观察者 * @author zzf * @date 2018/9/2 15:29. */ public class Observer { public void advice(Event event) { System.out.println("====== 触发事件,打印日志====\n" + event); } }
被观察者
/** * 被观察者 * @author zzf * @date 2018/9/2 15:28. */ public class Subject extends EventListener { //通常采用动态里实现监控,避免代码侵入publicvoid add() { System.out.println("add()"); trigger(SubjectEventType.ON_ADD); } publicvoid remove() { System.out.println("remove()"); trigger(SubjectEventType.ON_RMOVE); } }
public enum SubjectEventType {
ON_ADD,
ON_RMOVE,
ON_EDIT,
ON_QUERY;
}
test
public class ObserverTest { public static void main(String[] args) { try { // 观察者和被观察者没有必然的联系 // 注册的时候,才产生联系 Observer observer = new Observer(); Method advice = Observer.class.getMethod("advice", new Class[]{Event.class}); Subject subject = new Subject(); //添加监听 subject.addListener(SubjectEventType.ON_ADD, observer, advice); subject.add(); subject.remove(); } catch (Exception e) { } } }
2、使用场景
》关联行为场景
》事件多级触发场景
》跨系统的消息交换场景,如消息队列的处理机制。
3、总结
这是听咕泡学院视频的实战笔记。和书上的标准模式demo 相差还是蛮大的。
自己感觉能看懂,但是在实际中应用还是有点懵。
参考资料:
咕泡学院
原文:https://www.cnblogs.com/idea-persistence/p/9575560.html
内容总结
以上是互联网集市为您收集整理的设计模式九 观察者模式全部内容,希望文章能够帮你解决设计模式九 观察者模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。