目录
一、行为型模式
1.1、观察者模式
1.1.1、概述
1.1.2、案例实现
1.1.3、优缺点
1.1.4、使用场景
一、行为型模式
1.1、观察者模式
1.1.1、概述
观察者模式又称为 发布 - 订阅 模式.,就是让多个观察者对象同时监听同一个主题对象. 这个主题对象在变化的同时,也会把消息推送给所有观察者对象,使他们能够更新自己.
例如微信公众号,当微信用户点击关注某一公众号,当这个公众号的内容更新后,他就会把消息推送给所有关注了当前公众号的用户. 此时微信用户就是观察者,公众号就是被观察者.
观察者模式主要有以下角色:
- 抽象主题:所有的观察者对象都放在一个 List 集合中,每一个主题都可以有任意数量的观察者,并且提供 增加 和删除 观察者对象的接口.
- 具体主题:实现了抽象主题接口,并在有新的消息存入主题时,就会把消息推送给 List 中所有观察者.
- 抽象观察者:定义了一个更新接口,使得在主题更新消息时能随时通知自己.
- 具体观察者:实现了抽象观察者.
1.1.2、案例实现
实现上述案例.
/*** 抽象主题类*/
public interface Subject {/*** 增加订阅者* @param observer*/void attach(Observer observer);/*** 删除订阅者* @param observer*/void detach(Observer observer);/*** 通知订阅者更新消息* @param message*/void notify(String message);}
/*** 抽象观察者接口*/
public interface Observer {void update(String message);}
/*** 具体主题类:微信公众号*/
public class SubjectWeChat implements Subject {//存储订阅公众号的微信用户private List<Observer> userList = new ArrayList<>();@Overridepublic void attach(org.example.behavioral_mode.observer_mode.Observer observer) {userList.add(observer);}@Overridepublic void detach(org.example.behavioral_mode.observer_mode.Observer observer) {userList.remove(observer);}@Overridepublic void notify(String message) {for (Observer observer : userList) {observer.update(message);}}
}
/*** 具体观察者:微信用户*/
public class User implements Observer {//微信用户名private String name;public User(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 用户收到: " + message);}}
public class Client {public static void main(String[] args) {//微信公众号SubjectWeChat weChat = new SubjectWeChat();//订阅公众号weChat.attach(new User("李白"));weChat.attach(new User("杜甫"));weChat.attach(new User("辛弃疾"));//公众号更新消息,并推送给订阅的用户weChat.notify("微信公众号的诗集更新啦!");}}
执行结果如下:
1.1.3、优缺点
优点:
解耦合:降低了主题和观察者之间的耦合关系.
实现广播机制:主题发送通知,所有注册的观察者都能收到消息.
缺点:
如果观察者非常多,那么可能会有性能上的损耗.
如果主题有循环依赖的话,那么主题发送通知会使观察者循环调用,导致系统崩溃.
1.1.4、使用场景
当对象间存在 一对多 关系,一个对象的状态发生改变会影响到其他对象.
类似 发布 - 订阅模式时.