「这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战」。
一、什么是观察者模式
观察者模式:是一种行为模式,指被观察者与多个观察者之间存在依赖关系,当被观察者的状态发生变化,所有已注册的观察者都会收到通知并自动更新,观察者通过被观察者提供的方法完成注册。就像明星与粉丝的关系,明星是被观察者,粉丝是观察者,粉丝关注明星后,如果明星发布一条动态,所有关注的粉丝都会收到通知。
二、观察者模式的实现
下面就说说女神与追求者的关系,女神是被观察者,备胎们是观察者,通过加女神微信或者qq的方式关注女神。
public interface Observer {
void update(String message);
}
抽象的观察者角色。
public class UserObserver implements Observer {
private String name;
public UserObserver(String name){
this.name = name;
}
@Override
public void update(String message) {
System.out.println(this.name + "看到了消息:" + message);
}
}
具体观察者,实现了更新方法,收到通知时被调用。
public abstract class Subject {
protected List<Observer> observerList = new ArrayList<>();
public void attach(Observer observer){
observerList.add(observer);
}
public void remove(Observer observer){
observerList.remove(observer);
}
public abstract void notifyAllObserver(String message);
}
抽象被观察者,通过attach,remove方法实现添加观察者和移除观察者,以及观察者的通知方法。
public class GirlSubject extends Subject{
@Override
public void notifyAllObserver(String message) {
System.out.println("我要发布新的动态:"+message);
for (Observer observer : observerList) {
observer.update(message);
}
}
}
具体被观察者,实现了通知方法,这里就是说的女神了。
public static void main(String[] args) {
//被观察者 女神
Subject subject = new GirlSubject();
//观察者
Observer observer1 = new UserObserver("张三");
Observer observer2 = new UserObserver("李四");
//关注女神 一般备胎都是向女神申请好友吧
subject.attach(observer1);
subject.attach(observer2);
subject.notifyAllObserver("今天好想去逛街!");
}
先创建被观察者,然后创建两个观察者,观察者完成注册,调用通知接口。
三、总结
优点:被观察者与观察者是抽象耦合,降低了耦合性,符合依赖倒置原则,同时被观察者与观察者之间建立了一套触发机制。
缺点:观察者与被观察者之间的依赖关系未完全解除,可能出现循环引用的问题。当观察者很多的时候,一一通知观察者,程序的运行效率较差。
观察者模式的角色:
- 抽象主题角色:抽象被观察者角色,使用一个集合保存观察者,提供添加观察者,移除观察者以及通知所有观察者 的方法。
- 具体主题角色:具体被观察者角色,实现了通知所有观察者的方法。
- 抽象观察者角色:它是一个抽象类或接口,提供了一个更新自己的方法,收到通知的时候会被调用。
- 具体观察者角色:抽象观察者角色的实现。