软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理
一、简介
观察者模式是软件设计中的一种行为模式。它定义了对象之间的一对多关系,其中如果一个对象改变了状态,所有依赖它的对象都会自动被通知并更新。
这种模式包含了两种主要的角色,即被观察者(Subject)和观察者(Observer)。
- 被观察者:维护了一个观察者列表,并提供了注册和删除观察者的方法,当其状态发生变化时,会遍历观察者列表,通知所有观察者。
- 观察者:定义了一个更新接口,用于接收被观察者的通知并进行相应的更新操作。
二、实例
订阅微信公众号文章。
1、抽象被观察者(Subject)
代码语言:javascript复制public interface Subject {
void addObserver(Observer o);
void removeObserver(Observer o);
void notifyObserver();
}
2、具体被观察者(WeChatOfficialAccount)
代码语言:javascript复制@Slf4j
public class WeChatOfficialAccount implements Subject {
private List<Observer> list;
private String message;
public WeChatOfficialAccount() {
list = new ArrayList<>();
}
@Override
public void addObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if (!list.isEmpty()) {
list.remove(o);
}
}
@Override
public void notifyObserver() {
for (Observer observer : list) {
observer.update(message);
}
}
public void setInfo(String a) {
this.message = a;
log.info("微信公众号更新,新发布一篇文章:" a);
notifyObserver();
}
}
3、抽象观察者(Observer)
代码语言:javascript复制public interface Observer {
void update(String message);
}
4、具体观察者(WeChatUser)
代码语言:javascript复制@Slf4j
public class WeChatUser implements Observer {
private String name;
private String message;
public WeChatUser(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
log.info("用户:" name ", 收到订阅文章" message);
}
}
5、测试类(Main)
代码语言:javascript复制public class Main {
public static void main(String[] args) {
WeChatOfficialAccount weChatOfficialAccount = new WeChatOfficialAccount();
weChatOfficialAccount.addObserver(new WeChatUser("user1"));
weChatOfficialAccount.addObserver(new WeChatUser("user2"));
weChatOfficialAccount.setInfo("《微服务架构》");
}
}
控制台输出:
代码语言:javascript复制微信公众号更新,新发布一篇文章:《微服务架构》
用户:user1, 收到订阅文章《微服务架构》
用户:user2, 收到订阅文章《微服务架构》
三、总结
1、优点
- 解耦性:主题和观察者之间是松耦合的,它们可以独立地进行扩展和修改。
- 可重用性:可以方便地添加新的观察者来扩展功能。
- 灵活性:主题和观察者之间的通信是动态的,可以在运行时添加或删除观察者。
2、缺点
- 更新顺序:观察者的更新顺序是不确定的,可能导致一些问题。
3、应用场景
事件处理、图形用户界面(GUI)、订阅发布消息。