设计模式之观察者模式

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路设计模式之观察者模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就观察者模式简要概述。

什么是观察者模式
观察者模式就是提供一个观察类,当数据有修改时就通知绑定的其他对象。比如redis通知机制、配置中心一些调度算法等等,都运用到了观察者模式,这种模式还是属于行为型模式。

应用场景
1、一对多的服务场景,一个服务变更会影响其他服务的情况
2、监听机制,比如常用的一些中间件会动态监听客户端,如果有变化会通知其他客户端

优势与劣势
优点:1、观察者与被观察者是抽象耦合,一定程度上减少代码复杂度以及提升代码质量
缺点:1、被观察如果数量过大会造成通知逻辑出触发性能降低;2、有发生循环依赖的可能性。

小试牛刀
我们模拟微服务中的配置中心,如果我们修改了配置文件,配置中心会动态通知其他服务拉取新的配置文件。
我们定义一个服务配置中心ServiceCenter,提供缓存服务集合、服务注册、配置修改方法;然后定义一个服务抽象Service,内部提供配置中心属性及修改触发方法。最后创建3个OSS服务即可。
依赖关系为:
在这里插入图片描述

1、创建配置中心

/**
 * 模拟微服务配置心中 >> 观察者
 * @author senfel
 * @version 1.0
 
 * @date 2022/9/20 10:09
 */
@Data
public class ConfigCenter {

    private List<Service> serviceList = new ArrayList<>();
    /**
     * 配置文件名称
     */
    private String fileName;

    public ConfigCenter(String fileName) {
        this.fileName = fileName;
    }

    /**
     * 注册服务
     * @param service
     */
    public void registerService(Service service){
        serviceList.add(service);
    }

    /**
     * 通知文件已经修改
     */
    public void notice(){
        serviceList.forEach(Service::update);
    }

}

2、服务抽象类

/**
 * 模拟微服务 >> 被观察者抽象
 * @author senfel
 * @version 1.0
 * @date 2022/9/20 10:08
 */
@Data
public abstract class Service {

    /**
     * 配置中心
     */
    public ConfigCenter configCenter;

    /**
     * 变更
     */
    abstract void update();
}

3、OSS服务三个实体

/**
 * 服务1 >> 具体的被观察者
 * @author senfel
 * @version 1.0
 * @date 2022/9/20 10:54
 */
@Data
public class OssOneService extends Service{

    public OssOneService(ConfigCenter configCenter) {
        this.configCenter = configCenter;
        configCenter.registerService(this);
        System.err.println("服务OSS-1已注册到配置中心");
    }

    @Override
    void update() {
        System.err.println("服务OSS-1已知晓配置["+configCenter.getFileName()+"]修改,立即执行同步数据逻辑");
    }
}
/**
 * 服务2 >> 具体的被观察者
 * @author senfel
 * @version 1.0
 * @date 2022/9/20 10:54
 */
@Data
public class OssTwoService extends Service{

    public OssTwoService(ConfigCenter configCenter) {
        this.configCenter = configCenter;
        configCenter.registerService(this);
        System.err.println("服务OSS-2已注册到配置中心");
    }

    @Override
    void update() {
        System.err.println("服务OSS-2已知晓配置["+configCenter.getFileName()+"]修改,立即执行同步数据逻辑");
    }
}
/**
 * 服务3 >> 具体的被观察者
 * @author senfel
 * @version 1.0
 * @date 2022/9/20 10:54
 */
@Data
public class OssThreeService extends Service{

    public OssThreeService(ConfigCenter configCenter) {
        this.configCenter = configCenter;
        configCenter.registerService(this);
        System.err.println("服务OSS-3已注册到配置中心");
    }

    @Override
    void update() {
        System.err.println("服务OSS-3已知晓配置["+configCenter.getFileName()+"]修改,立即执行同步数据逻辑");
    }
}

4、测试观察者模式

/**
 * 观察者模式测试
 * @author senfel
 * @version 1.0
 * @date 2022/9/20 11:27
 */
@SpringBootTest
public class TestObserverPattern {

    @Test
    public void test(){
        //配置中心
        ConfigCenter configCenter = new ConfigCenter("application-pro.xml");
        //模拟OSS服务三个集群
        new OssOneService(configCenter);
        new OssTwoService(configCenter);
        new OssThreeService(configCenter);
        //修改配置文件
        System.err.println("修改配置文件");
        configCenter.notice();
    }
}

5、测试结果

服务OSS-1已注册到配置中心
服务OSS-2已注册到配置中心
服务OSS-3已注册到配置中心
修改配置文件
服务OSS-1已知晓配置[application-pro.xml]修改,立即执行同步数据逻辑
服务OSS-2已知晓配置[application-pro.xml]修改,立即执行同步数据逻辑
服务OSS-3已知晓配置[application-pro.xml]修改,立即执行同步数据逻辑

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154681.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!