当前位置:首页 >> 动力

如何优雅的使用装饰物器模式

来源:动力   2023年04月17日 12:15

vate INodeScopeService nodeScopeService; @Override public Set deptFindAllChildrenByParentIds(Collection parentIds) { Set result = new HashSet<>(); departmentService.departmentChildren(parentIds, result); return result; } @Override public Set deptFindScopeById(Long userId) { return nodeScopeService.deptFindScopeById(userId); }}

接下来就是对之前的字符进行时装饰性,判别一个装饰性机的做到类

(这个类并未 @Component, 并未实际上交给spring管理;沙了原文都会报错:找出了2个bean)

public class DataAccessorDecorator implements IDataAccessor { private final IDataAccessor iDataAccessor; public DataAccessorDecorator(IDataAccessor iDataAccessor) { this.iDataAccessor = iDataAccessor; } @Cacheable(cacheNames = "dept:parentId", key = "#p0", sync = true) @Override public Set deptFindAllChildrenByParentIds(Collection parentIds) { return iDataAccessor.deptFindAllChildrenByParentIds(parentIds); } @Cacheable(cacheNames = "dept:scope:userId", key = "#p0", sync = true) @Override public Set deptFindScopeById(Long userId) { return iDataAccessor.deptFindScopeById(nodeId,userId); }}

接下来还必需将这个装饰性机的类登记注册到spring当中

@Configuration@ConditionalOnBean({IDataAccessor.class})public class Config { @Bean @ConditionalOnBean({IDataAccessor.class}) public DataAccessorDecorator dataAccessorDecorator(IDataAccessor iDataAccessor) { return new DataAccessorDecorator(iDataAccessor); }}

根据业务,维护堆栈更新;这里用于的窃听主管和职员的暂定惨案

@Componentpublic class DataScopeEvict { /** * 移走主管系统对性堆栈 */ @CacheEvict(cacheNames = {"dept:parentId"}, allEntries = true) public void department() { } /** * 移走用户系统对性堆栈 */ @CacheEvict(cacheNames = {"dept:scope:userId"}, allEntries = true) public void user() { }}@Componentpublic class ScopeDataEventListener { @Autowired private DataScopeEvict evict; /** * 窃听主管暂定惨案 */ @EventListener public void departmentEvent(DepartmentChangeEvent event) { // 1 增沙 2 撤下 3 上级主管暂定 evict.department(); } /** * 窃听user暂定惨案 */ @EventListener public void userEvent(UserChangeEvent event) { // 2 撤下 3 主主管暂定 if (event.getType().equals(2) || event.getType().equals(3)) { evict.user(); } }}

一切准备就绪,用于的时候实际上用于装饰性机类就好了

@Servicepublic class UserService { @Autowired DataAccessorDecorator scopeDataAccessor; public Set deptFindAllChildrenByParentIds(Collection parentIds) { return scopeDataAccessor.deptFindAllChildrenByParentIds(parentIds); } public Set deptFindScopeById(Long userId) { return scopeDataAccessor.deptFindScopeById(userId); } }

以上就是一个将装饰性机方式上应用到实际项目的例子;

在这个例子当中,用于装饰性机方式上大幅提高了原本的字符,不变更原本的字符,原本的字符也能正确备有增值,只不过并未用于堆栈;只要方法名命名一致,必需变更注入的字符串就可以升级进行时,升级成本高还是很低的。

这波用于装饰性机方式上沙堆栈的操作方法读到到项目当中,实际上让你的字符 B ge pull full

小结

虽然用于装饰性机方式上样子B格高,但还是要留意自己项目的布景,为了让适合的方式解决情况。

成都风湿去哪看
武汉看男科去哪个医院好
长春生殖感染医院哪个好
复方鱼腥草合剂治疗喉咙痛效果怎么样
金笛复方鱼腥草合剂的功效与作用
友情链接