设计模式九 观察者模式
Posted idea-persistence
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式九 观察者模式相关的知识,希望对你有一定的参考价值。
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; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public Method getCallback() { return callback; } public void setCallback(Method callback) { this.callback = callback; } public Object getSource() { return source; } public void setSource(Object source) { this.source = source; } public String getTrigger() { return trigger; } Event setTrigger(String trigger) { this.trigger = trigger; return this; } @Override public String toString() { return "Event{" + "source=" + source + ", target=" + target + ", callback=" + callback + ", trigger=‘" + trigger + ‘‘‘ + ‘}‘; } }
public class EventListener { //相当注册器 protected Map<Enum, Event> events = new HashMap<>(); public void addListener(Enum eventType, Object taget, Method callback) { //注册事件 //反射调用 events.put(eventType, new Event(taget, callback)); } private void trigger(Event e) { e.setSource(this); e.setTimestamp(System.currentTimeMillis()); try { e.getCallback().invoke(e.getTarget(), e); } catch (Exception e1) { } } protected void 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("====== 触发事件,打印日志==== " + event); } }
被观察者
/** * 被观察者 * @author zzf * @date 2018/9/2 15:28. */ public class Subject extends EventListener { //通常采用动态里实现监控,避免代码侵入 public void add() { System.out.println("add()"); trigger(SubjectEventType.ON_ADD); } public void 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 相差还是蛮大的。
自己感觉能看懂,但是在实际中应用还是有点懵。
参考资料:
咕泡学院
以上是关于设计模式九 观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式补充:回调模式事件监听器模式观察者模式(转)
设计模式——行为型模式(责任链,命令,解释器,迭代器,中介者,备忘录,观察者,状态,空对象,策略,模板,访问者)