1. 模式简介 定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有观察者对象都会收到通知并更新。属于行为型设计模式
。观察者模式也被叫做发布订阅模式
。
2. 示例代码 这里我们使用观察者模式来模拟一个消息推送通知的场景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Data @NoArgsConstructor @AllArgsConstructor public class Message { private String message; private String from; private String to; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class Pusher extends Observable { private static Pusher PUSHER = null ; private Pusher () { } public static Pusher getInstance () { if (null == PUSHER) { PUSHER = new Pusher(); } return PUSHER; } public void pushMessage (Message message) { System.out.println(message.getFrom() + " 向 " + message.getTo() + " 发送了一条私信~~" ); setChanged(); notifyObservers(message); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @Data @AllArgsConstructor public class User implements Observer { private String name; @Override public void update (Observable o, Object arg) { Message message = (Message) arg; if (this .getName().equals(message.getTo())) { System.err.println(name + ",你收到一条来自 " + message.getFrom() + " 的私信!" ); System.err.println("私信内容: " + message.getMessage()); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class PatternTest { public static void main (String[] args) { User xkcoding = new User("xkcoding" ); Pusher pusher = Pusher.getInstance(); Message message = new Message("你好" , "user-1" , "xkcoding" ); pusher.addObserver(xkcoding); pusher.pushMessage(message); } }
1 2 3 user-1 向 xkcoding 发送了一条私信~~ xkcoding,你收到一条来自 user-1 的私信! 私信内容: 你好
3. UML 图例 4. 应用 5. 场景 观察者模式主要用于在关联行为之间建立一套触发机制的场景。
6. 优缺点 优点: 1、观察者和被观察者之间建立了一个抽象的耦合。 2、观察者模式支持广播通信。
缺点: 1、观察者之间有过多的细节依赖、提高时间消耗及程序的复杂度。2、使用需要及其谨慎,要避免循环调用。
7. 完整代码地址 https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/behavioral/observer