哈喽,大家好,我是指北君。装饰器设计模式大家肯定都听说过,但是有没有使用过呢,今天本君就跟大家分享一下装饰器模式应该如何使用。,装饰器模式(Decorator Pattern): 在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责;,感觉和继承如出一辙,不改变父类,子类可拓展功能;,优点,装饰类和被装饰类可以独立发展,不会相互耦合;,相比于继承,更加的轻便、灵活;,可以动态扩展一个实现类的功能,不必修改原本代码;,缺点,会产生很多的装饰类,增加了系统的复杂性。,这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐。,使用场景,对已有的目标功能存在不足,需要增强时,扩展类的功能。,动态增加功能,动态撤销,
,装饰器和代理的区别,场景:天气太热了,喝点儿冰水解解暑;加点儿柠檬片,让果汁好喝点儿。,先定义一个喝水的接口;,写一个接口的实现;,一个简单的装饰器;,开始测试;,运行结果;,一个简单的装饰器模式例子就写完了;当然这种例子在实际项目中肯定是用不到的,这里只是先了解一下装饰器模式,场景: 项目一期开发的时候,并没有给鉴权部分设置缓存;二期开发考虑到性能问题,想要给鉴权部分加上缓存,这里就选择了使用装饰器模式进行处理;,这里使用的缓存是spring的 spring-cache,不了解没关系,知道几个注解什么意思就行;,@Cacheable 表示要对方法返回值进行缓存;,@CacheEvict 删除缓存注解;,为了简洁,以下代码均为伪代码,首先,需要一个权限的接口和实现类;,实现类(注意这里加了@Service, 交给spring处理);,接下来就是对之前的代码进行装饰,定义一个装饰器的实现类;,(这个类没有 @Component, 没有直接交给spring管理;加了注解会报错:找到了2个bean);,接下来还需要将这个装饰器的类注册到spring中;,根据业务,维护缓存更新;这里使用的监听部门和员工的变更事件;,一切准备就绪,使用的时候直接使用装饰器类就好了;,以上就是一个将装饰器模式应用到实际项目的例子;,在这个例子中,使用装饰器模式增强了原本的代码,不修改原本的代码,原本的代码也能正确提供服务,只不过没有使用缓存;只要方法名命名一致,只需修改注入的字段就可以升级完成,升级成本还是很低的。,这波使用装饰器模式加缓存的操作写到项目中,直接让你的代码 B ge pull full。,虽然使用装饰器模式看起来B格高,但还是要注意自己项目的场景,选择适合的方式解决问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。