@TOC观察者模式
前言
代码code过程中对于特定的场景前人总结了很多方便、高效、扩展性高的设计模式,下面是在code过程中关于观察者模式的应用。
观察者模式类图
场景:
某操作导致对象A的状态发生变化,此时与A关联的B、C、D……都因为A的状态改变作出了不同的反应。
执行容器:
持有观察者集合,可以通过循环的方式统一执行观察者从父类继承过来的方法。
观察者:
继承父类,通过继承来的方法统一执行对应状态变化的各自操作。
简单总结:
父类引用指向子类,执行容器持有父类集合,通过循环父类集合执行观察者们的从父类继承的方法。
优点:避免面条代码、方便扩展
类图
执行容器:
ps:因为业务简单,不再对执行类进行封装抽象。
观察者:
##代码
执行容器:
/**
* @description:
* @author: mdh
* @Date:
*/
public class ObserverContent {
/**
* @description:观察者队列
* @author: mdh
* @date:
* @param:
* @return :
* @throws:
*/
protected List<BaseMapper> mapperList = new ArrayList<>();
/**
* @return : void
* @description:添加观察者到观察者队列
* @author: mdh
* @date:
* @param: [baseMapper]
* @throws:
*/
public void addObserver(BaseMapper baseMapper) {
this.mapperList.add(baseMapper);
}
/**
* @return :
* @description:通知观察者改变状态-更新状态
* @author: mdh
* @date:
* @param: [status]
* @throws:
*/
public Result updateStatus(int status) {
//使用parallelStream时为避免线程不安全,将mapperList转为线程安全集合,也可使用并发包下的集合,数据量大时可以
//Collections.synchronizedCollection(mapperList);
//mapperList.parallelStream().forEach(item -> item.updateStatus(status));
//使用stream循环执行观察者的操作
mapperList.stream().forEach(item -> item.updateStatus(status));
return new Result(true);
}
}
观察者类就是普通的mapper继承BaseMapper,父类中定义updateStatus,在xml中各自实现,这里就不多叙述。
main执行方法:
@Override
public Result updateObserverStatus(RequestVo requestVo) {
//状态执行类
ObserverContent observerContent = new ObserverContent();
//content观察者
BaseMapper contentMapper = smartKnowledgeMapContentMapper;
//map观察者
BaseMapper mapMapper = smartKnowledgeMapMapper;
//执行类注册观察者
observerContent.addObserver(contentMapper);
observerContent.addObserver(mapMapper);
//传入状态值,观察者们根据status值做出不同反应
observerContent.updateStatus(requestVo.getStatus());
return new Result(true);
}
总结
对于功能的实现面条代码也可以实现,设计模式的使用只是让我们的代码更美。观察者模式解决了订阅-发布这一场景的冗余,而且更容易扩展。水平有限,仅作参考