目录
一、行为型模式
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<>();
@Override
public void attach(org.example.behavioral_mode.observer_mode.Observer observer) {
userList.add(observer);
}
@Override
public void detach(org.example.behavioral_mode.observer_mode.Observer observer) {
userList.remove(observer);
}
@Override
public 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;
}
@Override
public 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、使用场景
当对象间存在 一对多 关系,一个对象的状态发生改变会影响到其他对象.
类似 发布 - 订阅模式时.