首页 > 应用开发 > Java > 学习设计模式——装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。它是作为现有的类的一个包装。
若要扩展一个对象的功能, 装饰器模式提供了比 继承更有弹性的替代方案。 组合优于继承。
何时使用:
UML 类图:
角色组成:
抽象构件角色:
具体构件角色:
抽象装饰角色:
具体装饰角色:
使用:
结果:
ConcreteComponent 通用基础逻辑
ConcreteDecorationA 的修饰逻辑
看到这里,相信大家对装饰器模式的通用代码结构清楚了许多,下面我们通过一个实际使用案例来进一步诠释。
相信大家都喝过奶茶,奶茶的种类有很多种,比如有椰香奶茶、QQ奶茶,巧克力奶茶等,奶茶中又可以添加椰果、红豆、布丁等不同的甜品。奶茶店现在要卖各种口味的奶茶,如果不使用装饰模式,那么在销售系统中,各种不一样的奶茶都要产生一个类,如果有5种奶茶类,5种甜品,那么就 会产生至少25个类(不包括混合口味),如果使用了装饰模式,那么几个类就可以搞定了。
奶茶接口类
具体的奶茶类:巧克力奶茶、QQ奶茶
抽象装饰类
具体装饰类:给奶茶加入椰果
具体装饰类:给奶茶加入布丁
具体装饰类:给奶茶加入珍珠
测试
测试结果:
巧克力奶茶
加了布丁!
加了椰果!
加了布丁的巧克力奶茶的价格:23.0
测试用例的两种写法结果都是一样的
由上面的案例可以看出装饰器模式的代码结构, 使用类的组合来代替继承,但其实装饰器模式相对于简单的组合关系,还有两个比较特殊的地方。
第一个比较特殊的地方是:装饰器类和原始类继承同样的父类,这样我们可以对原始类“嵌套”多个装饰器类。 比如上面测试类中的第二种写法,对巧克力奶茶嵌套了两个装饰器类,给它添加了椰果和布丁。
第二个比较特殊的地方是:装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点。 实际上,符合“组合关系”这种代码结构的设计模式有很多,比如之前讲过的代理模式、桥接模式,还有现在的装饰器模式。尽管它们的代码结构很相似,但是每种设计模式的意图是不同的。就拿比较相似的代理模式和装饰器模式来说吧,代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。
在 Java 中的 IO 类库是使用装饰器模式的经典场景。
一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套 一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传以后,毫无意外的短短半个小时点赞量就达到了 13k,说实话还是有点不可思议的。
需要完整版的小伙伴,可以一键三连后, 点击这里!
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
需要完整版的小伙伴,可以一键三连后, 点击这里!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000428/viewspace-2788285/ ,如需转载,请注明出处,否则将追究法律责任。