当前位置:编程学习 > JAVA >>

装饰模式

1.什么是装饰模式

装饰模式又称为包装(Wrapper)模式,装饰模式以客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

特点:扩展特定对象的功能,不是扩展某个类的功能;不需要子类,防止由于子类带来的复杂和混乱;对于一个给定对象,同时可能有不同的装饰对象,客户端可以通过它的需要选择合适的装饰对象。

2.装饰模式的结构

装饰模式以对客户端透明的方式为某个对象动态的附加更多功能,换言之,客户端不会觉得对象在装饰前后有什么区别。装饰模式可以在不使用创造更多子类的情况下,将对象功能进行扩展。

装饰模式的类图:

 \
 


装饰模式中的角色:

抽象构件(Component)角色:给出一个抽象接口,以规范接受附加责任的对象;

具体构件(ConcreteComponent)角色:定义一个接受附加责任的类;

装饰(Decorator)角色:持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口;

具体装饰(ConcreteDecorator)角色:负责给构件对象贴上附加责任;

源代码如下:


[java]
//抽象构件角色  
public interface Component(){ 
  public void sampleOption(); 

//具体构件角色  
public class ConcreteComponent implements Component(){ 
  public void sampleOption(){ 
      //some codes  
  } 

//装饰角色  
public Decorator implements Component(){ 
  private Component component; 
  public Decorator(Component component){ 
    this.component = component; 
  } 
  public void sampleOption(){ 
    this.component.sampleOption(); 
  } 

//具体装饰角色  
public ConcreteDecorator extends Decorator(){ 
  public ConcreteDecorator(Component component){ 
    super(component); 
  } 
  public void sampleOption(){ 
    this.component.sampleOption(); 
    //增加一些功能  
  } 

//抽象构件角色
public interface Component(){
  public void sampleOption();
}
//具体构件角色
public class ConcreteComponent implements Component(){
  public void sampleOption(){
      //some codes
  }
}
//装饰角色
public Decorator implements Component(){
  private Component component;
  public Decorator(Component component){
    this.component = component;
  }
  public void sampleOption(){
    this.component.sampleOption();
  }
}
//具体装饰角色
public ConcreteDecorator extends Decorator(){
  public ConcreteDecorator(Component component){
    super(component);
  }
  public void sampleOption(){
    this.component.sampleOption();
    //增加一些功能
  }
}
这里我们可以看一个例子:

我们要为超市的收银台设计一个打印票据的程序,有的需要打印票据的头信息,有的需要打印票据的页脚信息,有的只需要打印票据的内容。如果针对每一种情况都修改一次程序,势必会很麻烦。这时我们可以考虑使用Decorator模式。其结构类图如下:

 \
 

 

 


[java]
abstact class Component(){ 
  //这里定义一个抽象类,用于规范接受附加责任的对象  
  public abstact void printTicket(); 

class SalesTicket extends Component(){ 
  //这个是负责接受附加责任的类,因此它要实现printTicket方法  
  public void printTicket(){ 
    System.out.println("print SalesTicket."); 
  } 

abstract class TicketDecorator extends Component(){ 
  private Component myTrailer; 
  public Decorator(Component component){ 
    this.myTrailer = component; 
  } 
  //这里是装饰对象要附加的责任,也就是callTrailer方法  
  public void callTrailer(){ 
    if(myTrailer != NULL) 
      myTrailer.printTicket(); 
  } 

class Header extends TicketDecorator(){ 
  public Header(Component component){ 
    super(component); 
  } 
  //这里是具体的装饰对象,它负责实现具体要添加的责任  
  //同时它还是以抽象构件的函数形式展示给客户端,这样增加功能对客户端是透明的  
  public void printTicket(){ 
    System.out.println("print SalesTicket Header."); 
    super.callTrailer(); 
  } 

class Footer extends TicketDecorator(){ 
  public Footer(Component component){ 
    super(component); 
  } 
  public void printTicket(){ 
    super.callTrailer(); 
    System.out.println("print SalesTicket Footer."); 
  } 

public class client(){ 
  public static void main(String [] args){ 
    System.out.println("===================================="); 
    new Header(new Footer(new SalesTicket())).printTicket(); 
    System.out.println("===================================="); 
    new Footer(new Header(new SalesTicket())).printTicket(); 
    System.out.println("===================================="); 
  } 

abstact class Component(){
  //这里定义一个抽象类,用于规范接受附加责任的对象
  public abstact void printTicket();
}
class SalesTicket extends Component(){
  //这个是负责接受附加责任的类,因此它要实现printTicket方法
  public void printTicket(){
    System.out.println("print SalesTicket.");
  }
}
abstract class TicketDecorator extends Component(){
  private Component myTrailer;
  public Decorator(Component component){
    this.myTrailer = component;
  }
  //这里是装饰对象要附加的责任,也就是callTrailer方法
  public void callTrailer(){
    if(myTrailer != NULL)
      myTrailer.printTicket();
  }
}
class Header extends TicketDecorator(){
  public Header(Component component){
    super(component);
  }
  //这里是具体的装饰对象,它负责实现具体要添加的责任
  //同时它还是以抽象构件的函数形式展示给客户端,这样增加功能对客户端是透明的
  public void printTicket(){
    System.out.println("print SalesTicket Header.");
    super.callTrailer();
  }
}
class Footer extends TicketDecorator(){
  public Footer(Component component){
    super(component);
  }
  public void printTicket(){
    super.callTrailer();
    System.out.println("print SalesTicket Footer.");
  }
}
public class client(){
  public static void main(String [

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,