Java 23种设计模式之装饰者模式,使用场景及代码案例
装饰者模式
1.什么是装饰者模式?
概念:又名包装模式。动态给一个对象添加一些额外的职责。
若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。
2.装饰者模式的使用场景
2.1 以动态的方式给对象添加职责
2.2 处理那些可以撤销的职责
2.3 当采用生成子类的方法进行扩充时,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长
这里举一个例子,我们常见而且周董特别爱喝的奶茶,当然奶茶有多种口味,红豆,椰香,珍珠等等。。。
如图中一样,奶茶是由一种主料和五种辅料组合搭配而成,这个它们一一搭配的关系,同样也可以两两或者三三搭配,依次下来就会有很多种搭配可能。从开发角度来说,就相当于继承,每个奶茶品种可以看成一个子类。我们都知道子类的作用,子类是对父类方法的一个增强,子类拥有比父类更为强大的方法。把这种场景放到开发中会出现一种现象,每新增加一种辅料最后都会新增一个子类,最后就形成了类爆炸????,继承虽然可以增强父类的功能但是子类会越来越多,代码会显的特别臃肿。
3.为什么要使用装饰者模式
由上图场景中总结,这里我们看到如果使用子类继承父类,那么我们要写很对子类,这么做无疑增加了程序的臃肿性,并不是很灵活,这时,装饰者模式就诞生了。
4.装饰者模式的结构
- 抽象组件(Component):给出一个抽象接口,以规范准备接收附件责任的对象
- 被修饰者(ConcreteComponent):Component的具体实现,也就是我们要装饰的具体对象(相当于上图中的奶茶)
- 装饰者组件(Decorator): 也可以说是装饰器,持有组件对象的实例引用,该类的职责就是为了装饰具体组件对象,定义的基类
- 具体装饰(ConcreteDecorator):负责给构建对象装饰附件功能
结构图结合案例
前面理论,接下来代码实践
开发工具sts 运行环境Tomcat7.0
Drink.java
Decorator.java
MilkTea.java
Gem.java
RedBean.java
TestMain.java
测试方法
结果
代码只是一个结合装饰者模式编写的一个案例,对应着看方便理解,具体实现根据自己的项目需求而定,不当之处请指出。