在什么场景下我们可以使用观察者模式呢?有什么优缺点呢?
01观察者模式描述:
        观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式完美的将观察者和被观察的对象分离开。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

 

适合场景:当对一个对象的改变需要同时通知其他对象,而不知道具体有多少对象需要被改变,也不知道对象是谁。

 

     优点:(1)将对象解耦,将观察者和被观察者完全隔离。(2)可以快速接入多个观察者且不需要影响其他观察者。
缺点:(1)系统多个观察者服务会导致,调试维护难度增加。(2)Java中的消息的通知默认是顺序执行的,一个观察者的卡顿会影响整体的执行效率。       02
观察者模式案例-本地配置中心通知场景描述:

在实际项目中,我这里设计了一个配置中心功能,配置中心的值修改需要通知给reqSrc限流模块以及appId来源检验模块,该模式就可以使用观察者模式来实现。具体流程如下图所示:

观察者模式-什么场景可以使用_开源项目

如上图所示:第5步执行刷新本地缓存的时候,会调用

//观察者模式通知变更
setChanged();
notifyObservers();


其他观察者则会收到通知,执行具体的业务逻辑。 这里主要使用java.util包下面的观察者类进行实现

观察者模式-什么场景可以使用_配置信息_02

具体代码实现逻辑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

对于简单的项目,其实不需要使用这么多设计模式去实现,保证让初级程序员维护你的代码也能够迅速掌握理解,这个才关键~喵????