设计模式笔记:好玩的Decorator模式

《设计模式》对Decorator的描述:动态给一个对象添加一些额外职责。就添加功能来说,Decorator模式比生成子类更灵活。

Decorator让我感觉设计者非常聪明,这是个好有趣聪慧的模式,马上看例子:


1.不使用Decorator模式的设计:

a.需求:打印正文

java 代码
  1. public class Ticket{
  2. public void prtTicket(){
  3. System.out.println("Sales Ticket" );
  4. }
  5. }



b.需求改变:打印正文前,先打印Header

java 代码
  1. public class Ticket{
  2. public void prtTicket(){
  3. System.out.println("Header" );
  4. System.out.println("Sales Ticket" );
  5. }
  6. }


c.需求再度改变:正文后打印Footer

java 代码
  1. public class Ticket{
  2. public void prtTicket(){
  3. System.out.println("Header" );
  4. System.out.println("Sales Ticket" );
  5. System.out.println("Footer" );
  6. }
  7. }



2.使用Decorator后的设计:

java 代码
  1. abstract public class Component{
  2. abstract public void prtTicket();
  3. }
  4. abstract public class TicketDecorator extend Component {
  5. private Component myTrailer;
  6. public TicketDecorator(Component comp){
  7. myTrailer = comp;
  8. }
  9. public void callTrailer(){
  10. if (myTrailer != null )
  11. myTrailer.prtTicket();
  12. }
  13. }
  14. public class SaleTicket extend Component{
  15. public void prtTicket(){
  16. System.out.println("Sale Ticket" );
  17. }
  18. }
  19. public class Header extend TicketDecorator{
  20. public Header(Component comp){
  21. super (comp);
  22. }
  23. public void prtTicket(){
  24. System.out.println("Header" );
  25. super .callTrailer();
  26. }
  27. }
  28. public class Footer extend TicketDecorator{
  29. public Footer (Component comp){
  30. super (comp);
  31. }
  32. public void prtTicket(){
  33. super .callTrailer();
  34. System.out.println("Footer" );
  35. }
  36. }
  37. public class Test{
  38. public static void main(String args[]){
  39. Component c = new Header( new Footer( new SaleTicket()));
  40. c.prtTicket();
  41. }
  42. }


于是,无论添加多少个功能,每个Decorator都之关心自己的功能,我们能任意重排Decorator的顺序,无需改变任何代码。

在java io中用到了Decorator模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值