一、装饰者模式
1、装饰者模式(decorator pattern):指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。(属于结构型模式)
2、适用场景
3、优点
4、缺点
5、应用场景举例
例子1:早上买个煎饼去公司吃,卖煎饼的大姐可以给你的煎饼加鸡蛋、也可以加热狗等。
定义一个煎饼cake类:
定义一个加鸡蛋的煎饼cakewithegg类:
再定义一个既加鸡蛋又加热狗的煎饼cakewitheggandhotdog类:
客户端测试代码:
运行结果:
类结构图:
运行结果没有问题。但如果用户需要一个加2个鸡蛋、加1根热狗的煎饼,那么用现在的类结构是创建不出来的,也无法自动计算出价格,除非再创建一个类做定制,如果需求再变,一直加定制显然是不科学的。下面用装饰者模式来解决上面的问题。
首先定义一个制作煎饼的抽象类cake:
定义一个基本的煎饼(基础套餐)basecake类:
定义一个扩展套餐的抽象装饰者cakedecorator类:
定义一个鸡蛋装饰者eggdecorator类:
定义一个热狗装饰者hotdogdecorator类:
客户端测试代码:
运行结果:
类结构图:
例子2:上次讲的适配器模式,为了实现新功能与老功能兼容,定义一个新的类继承已有的类来实现功能扩展,遵循开闭原则。今天再用装饰者模式再升级一次代码,同时也做一个更好的对比。
先看原来的代码,user类:
result类:
isigninservice接口:
signinserviceimpl实现类:
来看升级以后的代码,定义一个新的接口isigninforthirdservice继承原来的接口:
定义一个新的逻辑处理类signinforthirdserviceimpl,实现第三方登录自由适配:
客户端测试代码:
装饰者模式最本质的特征是将原有类的附加功能抽离出来,简化原有类的逻辑。其实抽象的装饰者是可有可无的,具体可以根据业务模型来选择。
6、装饰者模式和适配器模式的对比
装饰者和适配器模式都是包装模式(wrapper pattern),装饰者也是一种特殊的代理模式。
7、装饰者模式在源码中的应用
① 在jdk中体现最明显的类就是io相关的类,如bufferedreader、inputstream、outputstream,看一下常用的inputstream类结构图:
② 在spring中的transactionawarecachedecorator类也有用到,该类主要是用来处理事务缓存相关,如下代码:
③ transactionawarecachedecorator就是对cache的一个包装。再如mvc中的装饰者模式httpheadresponsedecorator类:
二、观察者模式
1、观察者模式(observer pattern):指定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新。(属于行为型模式,观察者模式有时也叫做发布订阅模式)
2、优点
3、缺点
4、应用场景举例
观察者模式主要用于在关联行为之间建立一套触发机制的场景。比如微信朋友圈动态通知、群消息通知、邮件通知、广播通知、桌面程序的事件响应等。如下:
例子:生产者与消费者模型。使用jdk提供的一种观察者的实现方式来实现。
先定义一个消息message类:
定义一个生产者productor类:
定义一个消费者consumer类:
客户端测试代码:
运行结果:
5、基于guava api轻松落地观察者模式
先引入guava框架的maven依赖包:
定义一个监听事件guavaevent类:
客户端测试代码:
运行结果:
如对本文有疑问, 点击进行留言回复!!
设计模式之单例模式(Singleton Pattern),太简单了
java多线程定时器和java判断一个时间是否在时间区间内和用正则表达式获取String字符串之间的数据
网友评论