“ 在什么场景下我们可以使用观察者模式呢?有什么优缺点呢?”
01—观察者模式描述:
观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式完美的将观察者和被观察的对象分离开。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
适合场景:当对一个对象的改变需要同时通知其他对象,而不知道具体有多少对象需要被改变,也不知道对象是谁。
优点:(1)将对象解耦,将观察者和被观察者完全隔离。(2)可以快速接入多个观察者且不需要影响其他观察者。
缺点:(1)系统多个观察者服务会导致,调试维护难度增加。(2)Java中的消息的通知默认是顺序执行的,一个观察者的卡顿会影响整体的执行效率。 02—
观察者模式案例-本地配置中心通知场景描述:
在实际项目中,我这里设计了一个配置中心功能,配置中心的值修改需要通知给reqSrc限流模块以及appId来源检验模块,该模式就可以使用观察者模式来实现。具体流程如下图所示:
如上图所示:第5步执行刷新本地缓存的时候,会调用
//观察者模式通知变更
setChanged();
notifyObservers();
其他观察者则会收到通知,执行具体的业务逻辑。 这里主要使用java.util包下面的观察者类进行实现:
具体代码实现逻辑DEMO:配置中心
-
public class LocalConfigObservable extends Observable { private String info; public void setLocalConfig(String info) { this.info=info; System.out.println("设置配置为:"+info); setChanged(); notifyObservers(); } public String getInfo() { return info; } }
appId模块与reqSrc模块:
public class AppIdLimiter implements Observer {
private Observable ob;
private String appId;
public AppIdLimiter(Observable ob, String appId) {
this.ob = ob;
this.appId=appId;
ob.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
LocalConfigObservable t=(LocalConfigObservable)o;
System.out.println(appId+"获取的配置信息:"+t.getInfo());
}
}
public class ReqSrcLimiter implements Observer {
private Observable ob;
private String reqSrc;
public ReqSrcLimiter(Observable ob, String reqSrc) {
this.ob = ob;
this.reqSrc=reqSrc;
ob.addObserver(this);
}
@Override
public void update(Observable o, Object arg) {
LocalConfigObservable t=(LocalConfigObservable)o;
System.out.println(reqSrc+"获取的配置信息:"+t.getInfo());
}
}
模拟调用代码:
-
public class TestObserver { public static void main(String[] args) { LocalConfigObservable localConfigObservable = new LocalConfigObservable(); AppIdLimiter appIdLimiter = new AppIdLimiter(localConfigObservable,"test-appId"); ReqSrcLimiter reqSrcLimiter = new ReqSrcLimiter(localConfigObservable,"test-reqSrc"); localConfigObservable.setLocalConfig("appId=1"); } }
-
输出结果: 设置配置为:appId=1 test-reqSrc获取的配置信息:appId=1 test-appId获取的配置信息:appId=1
对于简单的项目,其实不需要使用这么多设计模式去实现,保证让初级程序员维护你的代码也能够迅速掌握理解,这个才关键~喵????