装饰模式Decorator
创始人
2024-03-18 14:17:49
0

1.意图:动态地给一个对象添加一些额外职责。就增加功能而言,Decorator模式比生成子类更加灵活。
2.结构
在这里插入图片描述

Component定义一个对象接口,可以给这些对象动态地添加职责;
ConcreteComponent定义一个对象,可以给这个对象添加一些职责;
Decorator维持一个指向Component对象的指针,并定义一个于Component接口一致的接口;
ConcreteDecorator向组件添加职责。
3.适用性:
在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
处理那些可以撤销的职责;
当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,由于类定义被隐藏,或类定义不能用于生成子类。
代码案例
某发票Invoice由抬头Head部分、正文部分和脚注Foot部分构成。现采用装饰Decorator模式实现打印发票的功能。
软件设计师考试2016年下半年下午题第6题

/*** 装饰模式*/
class Invoice{public void printInvoice(){System.out.println("This is the content of the invoice!");}
}class Decorator extends Invoice{protected Invoice ticket;public Decorator (Invoice t){ticket = t;}public void printInvoice(){if(ticket!=null) {ticket.printInvoice();}}
}
class HeadDecorator extends Decorator{public HeadDecorator(Invoice t) {super(t);}public void printInvoice(){System.out.println("This is the header of the invoice!");super.printInvoice();}
}
class FootDecorator extends Decorator{public FootDecorator(Invoice t) {super(t);}public void printInvoice(){super.printInvoice();System.out.println("This is the foot of the invoice!");}
}
class Test{public static void main(String[] args) {Invoice t = new Invoice();Invoice ticket;ticket = new HeadDecorator(new FootDecorator(t));ticket.printInvoice();System.out.println("--------------------");ticket = new HeadDecorator(new FootDecorator(null));ticket.printInvoice();}
}

运行结果
在这里插入图片描述

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...