观察者设计模式
- 什么是观察者设计模式
- 观察者设计模式应用场景
- 观察者设计模式Demo
- 观察者设计模式总结
- 观察者设计模式在Android源码中的应用
1. 什么是观察者设计模式
观察者设计模式是一个结构型模式。定义对象间一种一对多的关系,使得每当一个对象改变状态,则所有依赖于它的对象都会收到通知并被自动更新。
2. 观察者设计模式应用场景
- 多用于实现订阅功能
3. 观察者设计模式Demo
需求
当Jay在微博发布新歌的时候,所有订阅过Jay微博的歌迷可以自动收到消息提醒。
要实现此功能需要以下几个角色:
- Observer :观察者
- ConcreteObserver :具体的观察者
- Subject : 目标
- ConcreteSubject :具体的目标
首先建立观察者<mark>Observer</mark>,如下:
public interface Observer {
void updata();
}
然后建立<mark>Subject</mark>
public interface Subject {
//注册观察者
public void register(Observer observer);
//取消注册
public void unRegister(Observer observer);
//通知观察者
public void notifyAllFans();
}
创建<mark>Subject</mark>的具体实现类<mark>ConcreteSubject</mark>
public class ConcreteSubject implements Subject{
//将观察者存入ArrayList
private List<Observer> observerList = new ArrayList<>();
@Override
public void register(Observer observer) {
observerList.add(observer);
}
@Override
public void unRegister(Observer observer) {
if(observerList!=null && observerList.size()>0){
System.out.println("歌迷取消关注");
observerList.remove(observer);
}
}
@Override
public void notifyAllFans() {
System.out.println("通知:发布新专辑依然范特西2");
for (Observer observer :observerList){
observer.update();
}
}
}
实现观察者<mark>ConcreteObserver1</mark>和<mark>ConcreteObserver2</mark>
public class ConcreteObserver1 implements Observer {
@Override
public void update() {
System.out.println("歌迷:ConcreteObserver1 收到通知");
}
}
public class ConcreteObserver2 implements Observer {
@Override
public void update() {
System.out.println("歌迷:ConcreteObserver2 收到通知");
}
}
将<mark>ConcreteObserver1</mark>和<mark>ConcreteObserver2</mark>注册为观察者:
public class SongConference {
public static void main(String[] args){
ConcreteSubject concreteSubject = new ConcreteSubject();
ConcreteObserver1 observer1 = new ConcreteObserver1();
ConcreteObserver2 observer2 = new ConcreteObserver2();
//注册为观察者
concreteSubject.register(observer1);
//注册为观察者
concreteSubject.register(observer2);
concreteSubject.notifyAllFans();
//取消注册为观察者
concreteSubject.unRegister(observer2);
concreteSubject.notifyAllFans();
}
}
打印结果:
通知:发布新专辑依然范特西2
歌迷:ConcreteObserver1 收到通知
歌迷:ConcreteObserver2 收到通知
通知:发布新专辑依然范特西2
歌迷:ConcreteObserver1 收到通知
4. 观察者设计模式总结
优点
- 观察者与被观察者之间是抽象耦合,应对业务变化
- 增强系统的灵活性、可扩展性
- 符合开闭原则
缺点
需要考虑开发效率和运行效率的问题,程序中包含一个被观察者、多个观察者,开发和调试等内容会比较复杂,而且在java中消息的通知默认是按照顺序执行,一个观察者卡顿,会影响整体的执行效率,在这种情况下一般考虑采用异步的方式。