转自:
http://www.java265.com/JavaCourse/202206/3741.html
下文笔者讲述观察者模式的简介说明,如下所示
观察者模式: 称为发布/订阅(Publish/Subscribe)模式 用于定义一个一对多的依赖关系, 当一个对象状态发生变化时,依赖它的对象都会收到通知 观察者模式优点: 1.观察者和被观察者是抽象耦合的 2.建立一套触发机制 观察者模式缺点: 1.当一个被观察者对象有很多的直接和间接的观察者的话 将所有的观察者都通知到会花费很多时间。 2.当观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃 3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。 如: 公众号发布消息,关注它的微信都可以收到更新通知 这就是一种典型的观察者模式的实现 那么如何实现观察者模式呢?下文将一一道来,如下所示:
例:
观察者模式的示例代码
//抽象被观察者接口 public interface Observerable { //订阅 void registerObserver(Observer o); //取消订阅 void removeObserver(Observer o); //更新 void notifyObserver(); } 2 抽象观察者接口 //抽象观察者接口 public interface Observer { //接受变动通知 public void update(String message); } 3观察者实现接口 // 观察者 public class User implements Observer { private String name; private String message; public User(String name) { // TODO Auto-generated constructor stub this.name = name; } @Override public void update(String message) { // TODO Auto-generated method stub this.message = message; read(); } private void read() { // TODO Auto-generated method stub System.out.println(name + " 收到推送消息: " + message); } } 4 被观察者实现接口 import java.util.ArrayList; import java.util.List; // 被观察者, 微信公众号 public class WechatServer implements Observerable { //注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程 private List<Observer> list; private String message; public WechatServer() { list = new ArrayList<Observer>(); } @Override public void registerObserver(Observer o){ list.add(o); } @Override public void removeObserver(Observer o) { if(!list.isEmpty()) list.remove(o); } //遍历 @Override public void notifyObserver(){ for(int i = 0; i < list.size(); i++) { Observer oserver = list.get(i); oserver.update(message); } } public void setInfomation(String s) { this.message = s; System.out.println("微信服务更新消息: " + s); //消息更新,通知所有观察者 notifyObserver(); } } 测试 public class Main{ public static void main(String[] args) { //创建微信服务器对象 WechatServer server = new WechatServer(); //创建多个用户对象 User a = new User("maomao"); User b = new User("java265"); User c = new User("hahaha"); //订阅者用户接受消息 server.registerObserver(a); server.registerObserver(b); server.registerObserver(c); //微信服务器发送消息 server.setInfomation("我要发送一个消息"); System.out.println("------------华丽的分割线---------------"); / /c把订阅号给取消了 server.removeObserver(c); //微信服务器修改消息 server.setInfomation("发送消息二"); } }