17.观察者模式
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
观察者接口:实现更新方法
public interface Observer { public void update(String msg); }
被观察者接口:需要在notify方法中调用观察者的update方法
public interface Subject { public void add(Observer observer); public void remove(Observer observer); public void notifyPeople(String string); }
观察者实现类
public class QQUser implements Observer { private String name; public QQUser(String name) { this.name = name; } @Override public void update(String msg) { System.out.println("QQ用户:"+name+msg); } } public class WeiXinUser implements Observer { private String name; public WeiXinUser(String name) { this.name = name; } @Override public void update(String msg) { System.out.println("微信用户:"+name+msg); } }
被观察者实现类
public class ConcreteSubject implements Subject { ArrayList<Observer> list=new ArrayList<>(); @Override public void add(Observer observer) { list.add(observer); } @Override public void remove(Observer observer) { list.remove(observer); } @Override public void notifyPeople(String string) { for(Observer observer:list){ observer.update(string); } } public static void main(String[] args) { QQUser user = new QQUser("小吴"); WeiXinUser user1 = new WeiXinUser("小民"); ConcreteSubject subject = new ConcreteSubject(); subject.add(user); subject.add(user1); subject.notifyPeople("小葵花妈妈课堂开课了"); } }
使用场景
关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。
事件多级触发场景。
跨系统的消息交换场景,如消息队列、事件总线的处理机制。
优点
解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。
缺点
在应用观察者模式时需要考虑一下开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行,那么一个观察者卡顿,会影响整体的执行效率,在这种情况下,一般会采用异步实现。