一.概念
动态的给一个对象添加额外的职责。想要扩展功能的话,装饰者提供了一种有别于继承的另外一种选择。
二.UML
- Component(概念中提到的对象接口),也就是“被装饰者”。
- ConcreateComponent(未添加任何职责的,对象接口的子类)。
- Decorator(装饰者抽象类),扩张了对象接口的功能。
- ConcreteDrcorator(具体装饰类),具体怎么装饰对象接口的在这些类里面反映。
三.实例分析
家里买了一套房子,需要装修,考虑到预算只有这么多,不能采用全包的方式,于是采用将装修工作细化,以节省开销。
House
- package com.zzy.decorator;
- /**
- * 被装修者-房子
- * @author eason
- *
- */
- public interface House {
- public void decorate();
- }
BlankHouse
- package com.zzy.decorator;
- /**
- * 未经装修的房子
- * @author eason
- *
- */
- public class BlankHouse implements House{
- @Override
- public void decorate() {
- System.out.println("未经装修的房子");
- }
- }
Decorator
- package com.zzy.decorator;
- /**
- * 装修工抽象类
- * @author eason
- *
- */
- public class Decorator implements House{
- private House house;
- public Decorator(House house) {
- this.house = house;
- }
- @Override
- public void decorate() {
- house.decorate();
- }
- }
ElectricWirer
- package com.zzy.decorator;
- /**
- * 电线工
- * @author eason
- *
- */
- public class ElectricWirer extends Decorator {
- public ElectricWirer(House house) {
- super(house);
- }
- @Override
- public void decorate() {
- super.decorate();
- //自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
- System.out.println("已经装修完电线");
- }
- }
Floorer
- package com.zzy.decorator;
- /**
- * 地板工
- * @author eason
- *
- */
- public class Floorer extends Decorator {
- public Floorer(House house) {
- super(house);
- }
- @Override
- public void decorate() {
- super.decorate();
- //自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
- System.out.println("已经装修完地板");
- }
- }
WaterPiper
- package com.zzy.decorator;
- /**
- * 水管工
- * @author eason
- *
- */
- public class WaterPiper extends Decorator {
- public WaterPiper(House house) {
- super(house);
- }
- @Override
- public void decorate() {
- super.decorate();
- //自己的逻辑-具体怎么包装的写在super.decorate()的前后任何地方
- System.out.println("已经装修完水管");
- }
- }
TestDecorator
- package com.zzy.decorator;
- /**
- * 测试类
- * @author eason
- *
- */
- public class TestDecorator {
- public static void main(String[] args) {
- //空白房子一个
- House house = new BlankHouse();
- //一层层装修
- Decorator dec = new Floorer(new ElectricWirer(new WaterPiper(house)));
- dec.decorate();
- }
- }
四.使用场景
- 为已有组件动态添加更多功能。
五.使用感受
- 将装饰功能的代码从Component里面提了出来,简化了Component。
- 客户端可以在运行时根据需要,选择需要的功能来包装Component。
- 继承是扩展功能的方式之一,但并不见得是达到弹性设计的最佳形方式。
- 组合和委托可用于在运行时动态地加上新的行为。装饰者模式实际上就是组合和委托。再次提到组合和委托,第一次提到是在策略模式 里面。
- 在日常的设计中,应该允许行为被扩展,而不需修改现有的代码。
- 装修者会导致设计中出现许多小对象,如果过度使用,会让程序变的复杂。
相关推荐
ZY Player APP :sparkles:特性 :hamburger:视频源支持自定义,支持链接引入 :hot_dog:播放历史,自动取消历史进度 :sandwich:支持搜索功能,搜索结果图片显示 :popcorn:支持收藏夹功能 :fried_shrimp:支持青...
51单片机控制的循迹避障小车,支持红外遥控,可以实现前进后退左右和循迹切换
智能小车的相关功能例程,并且有程序的注释,
ZY-TP21便捷式打印机驱动是一款嵌入式微型打印机,这款打印机体积小,重量轻,噪音低,易集成,操作简单,可靠性强,这里介绍的正是针对这款打印机的驱动,ZY-TP21便捷式打印机驱动,有需要的朋友们快来下载吧。...
ZY3-01星SC产品命名规范20160217.pdf
该套设备采用ZY6400-23.5/45型液压支架,最大采高达4.5 m。由于十二矿井下主要巷道断面较小,支架必须解体入井安装,回采结束后支架回撤又面临一个新课题。针对这个难题,十二矿改革回收工艺,采取相应的安全措施,顺利地...
ZY-Player-Setup-2.6.4.exe
循迹小车的单片机程序。仅供参考大家互相学习,共同进步本次上传日志本次上传日志本次上传日志本次上传日志要求上传您自己觉得好的资料本次上传日志
VMware Workstation7.1.2 build-301548汉化包 ...-------------------------------------------- ...VMware Workstation7.1.2 VM7.1.2注册机VM7.1.2汉化包 VM7.1.2序列号 VM7.1.2汉化包VMware Workstation7.1.2 VM7.1.2...
RF-SJ-ZY-04-F08 采暖通风设计图纸审查标准及要点(1).zip
不用换找资源,本身自带资源搜索的播放器
程序设计语言ZY1906-大作业.7z
吉林中易CMS【ZY-CMS】是一款开源免费asp内容管理系统,全站CSS div布局,为用户的修改提供方便,网站内容的每一个角落都可以在后台予以管理,是一套非常适合用做系统建站或者进行二次开发的程序核心。吉林中易CMS...
RF-YX-ZY-07-F02 设计通知.zip
ZY-Player-Setup-2.6.1.exe
RF-GC-ZY-02-F06 精装修专项计划.zip
RF-SJ-ZY-06-F02 设计变更指令单.zip