什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就观察者模式简要概述。
什么是观察者模式
观察者模式就是提供一个观察类,当数据有修改时就通知绑定的其他对象。比如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