本文概览:介绍观察者模式与事件监听模式。
1 观察者模式
1.1 模式介绍
1、 定义
观察者模式定义了对象之间的一对多依赖,即,一个主题对应多个观察者。当一个主题对象改变状态时,它的所有依赖者(观察者)都会收到通知并自动更新。可以通过 “公众号发送消息”实例来理解:公众号会保存所有订阅者,有消息之后,会发送给所有订阅者。
2、观察模式和策略模式比较
观察者模式解决的是对象和对象之间的依赖关系。它解决的是多个对象依赖一个对象的关系:一个主题对象状态改变,需要通知所有观察者对象。而在策略模式中,解决的是一个对象内部的不断变化的方法。
1.2 实现
主要包含 主题和 观察者两种对象。
1、主题
在主题类中定义了一个观察者数组,,这样就实现了主题和观察者之间1对多的关系。
1 2 3 4 5 6 7 |
public interface Subject { // 注册 void registerObserver(Observer observer); // 发送通知 void sendMsg(String msg); } |
具体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class ConSubject implements Subject { // 观察者集合 private List<Observer> observerList = Lists.newArrayList(); public void registerObserver(Observer observer) { observerList.add(observer); } // 发送通知 public void sendMsg(String msg) { for (Observer observer : observerList) { observer.recvMessage(msg); } } } |
2、观察者
1 2 3 4 |
public interface Observer { // 接受主题的消息 void recvMessage(String msg); } |
一个具体观察者
1 2 3 4 5 6 7 8 9 10 11 12 |
public class AObserver implements Observer { private Subject subject; AObserver(Subject subject) { this.subject = subject; subject.registerObserver(this); } public void recvMessage(String msg) { System.out.println("A 接受主题消息:" + msg); } } |
3、测试
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args) { ConSubject subject = new ConSubject(); AObserver observer = new AObserver(subject); // 发送消息 System.out.println("主题发送消息:--"); subject.sendMsg("Message Content"); } } |
执行结果为
1 2 |
主题发送消息:-- A 接受主题消息:Message Content |
2 事件监听模式
跟主题模式类似,事件监听模式包括一个EventLister(看成是观察者),ListenerSupport(监听器管理器,类似于主题),还有一个Event 表示事件,可以理解为 主题观察者 中消息 message。
1、Event
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Event { private String data; private String type; Event(String data,String type){ this.data = data; this.type = type; } public String getData() { return data; } public void setData(String data) { this.data = data; } public String getType() { return type; } public void setType(String type) { this.type = type; } } |
2、监听器
1 2 3 |
public interface EventListener { public void processEvent(Event event); } |
具体监听器
1 2 3 4 5 6 |
public class EventListenerA implements EventListener { public void processEvent(Event event) { System.out.println("type:" + event.getType()); System.out.println("data:" + event.getData()); } } |
3、事件管理器
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ListenerSupport { private List<EventListener> listenerList = Lists.newArrayList(); public void registry(EventListener listener) { listenerList.add(listener); } public void triggerEvent(Event event) { for (EventListener listener : listenerList) { listener.processEvent(event); } } } |
4、测试
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args){ EventListenerA a =new EventListenerA(); ListenerSupport listenerSupport = new ListenerSupport(); listenerSupport.registry(a); // 触发事件 listenerSupport.triggerEvent(new Event("Adata","Atype")); } } |
结果为
1 2 |
type:Atype data:Adata |
参考: