一. 观察者模式简介
1. 定义
观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。
2. 意义
此设计模式最重要的作用就是 解耦!将观察者与被观察者解耦,使得他们之间的依赖性更小。
3.UML图
- Subject:就是“被观察”的角色,它将所有观察者对象的引用保存在一个集合中。
- Observer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时通知自己。
- ConcreteObserver:具体的观察者。
二. 观察者模式实现
以上理论相信大家并不模式,现在我们来应用到实际中。
1. 被观察者Subject对象
首先是一个Subject类的父类,它实现了维护装有观察者引用集合的功能。
public class Subject {
//保存注册的观察者对象
private List<Observer> mObervers = new ArrayList<>();
//注册观察者对象
public void attach(Observer observer) {
mObervers.add(observer);
Log.e("SZH", "attach an observer");
}
//注销观察者对象
public void detach(Observer observer) {
mObervers.remove(observer);
Log.e("SZH", "detach an observer");
}
//通知所有注册的观察者对象
public void notifyEveryOne(String newState) {
for (Observer observer : mObervers) {
observer.update(newState);
}
}
}
接着是一个具体的被观察者对象
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void change(String newState) {
state = newState;
Log.e("SZH", "concreteSubject state:" + newState);
//状态发生改变,通知观察者
notifyEveryOne(newState);
}
}
2. 观察者Observer对象
首先是一个接口,抽象出了一个及时更新的方法
public interface Observer {
void update(String newState);
}
接着是几个观察者对象。
public class ObserverA implements Observer {
//观察者状态
private String observerState;
@Override
public void update(String newState) {
//更新观察者状态,让它与目标状态一致
observerState = newState;
Log.e("SZH", "接收到消息:" + newState + ";我是A模块,快来抢吧!!");
}
}
public class ObserverB implements Observer {
//观察者状态
private String observerState;
@Override
public void update(String newState) {
//更新观察者状态,让它与目标状态一致
observerState = newState;
Log.e("SZH", "接收到消息:" + newState + ";我是B模块,快来抢吧!!");
}
}
public class ObserverC implements Observer {
//观察者状态
private String observerState;
@Override
public void update(String newState) {
//更新观察者状态,让它与目标状态一致
observerState = newState;
Log.e("SZH", "接收到消息:" + newState + ";我是C模块,快来抢吧!!");
}
}
最后是调用方法:
public class ObserverActivity extends Activity {
private ConcreteSubject mConcreteSubject;
private ObserverA mObserverA;
private ObserverB mObserverB;
private ObserverC mObserverC;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mConcreteSubject = new ConcreteSubject();
mObserverA = new ObserverA();
mObserverB = new ObserverB();
mObserverC = new ObserverC();
mConcreteSubject.attach(mObserverA);
mConcreteSubject.attach(mObserverB);
mConcreteSubject.attach(mObserverC);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mConcreteSubject.change("倒计时结束,开始秒杀");
}
}, 3000);
}
}
为了让大家更好的理解,以上uml图可以通过下面这个图更好地记忆。
三. 最后
以上设计模式的代码都已经集成到demo中,欢迎下载查看。
该demo会陆续集成各种设计模式,欢迎关注。
参考
https://blog.csdn.net/weixin_39494923/article/details/94553662
https://blog.csdn.net/ma598214297/article/details/80557821