设计模式:Decorator模式

翻译|其它|编辑:郝浩|2008-03-12 10:05:25.000|阅读 811 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

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

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

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

a.需求:打印正文

java 代码
public class Ticket{
 public void prtTicket(){
  System.out.println("Sales Ticket");
 }
}

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

java 代码
public class Ticket{
 public void prtTicket(){
  System.out.println("Header");
  System.out.println("Sales Ticket");
 }
}

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

java 代码
public class Ticket{
 public void prtTicket(){
  System.out.println("Header");
  System.out.println("Sales Ticket");
  System.out.println("Footer");
 }
}

2.使用Decorator后的设计:

java 代码
abstract public class Component{
 abstract public void prtTicket();
}

abstract public class TicketDecorator extend Component {
 private Component myTrailer;
 public TicketDecorator(Component comp){
  myTrailer = comp;
 }
 public void callTrailer(){
  if(myTrailer != null)
  myTrailer.prtTicket();
 }

}

public class SaleTicket extend Component{
 public void prtTicket(){
  System.out.println("Sale Ticket");
 }
}

public class Header extend TicketDecorator{
 public Header(Component comp){
  super(comp);
 }
 public void prtTicket(){
  System.out.println("Header");
  super.callTrailer();
 }
}

public class Footer extend TicketDecorator{
 public Footer (Component comp){
  super(comp);
 }
 public void prtTicket(){
  super.callTrailer();
  System.out.println("Footer");
 }
}

public class Test{
 public static void main(String args[]){
  Component c = new Header(new Footer(new SaleTicket()));
  c.prtTicket();
 }
}

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

在java io中用到了Decorator模式。
标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:JavaEyE

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP