装饰模式可以动态地给一个对象添加一些额外的职责。比子类更加灵活。装饰模式可以无需创建子类的情况下扩展类的功能。下面通过一个打印发票的例子来说明。发票分为三个部分:头部,主体,尾部。而主体不变,头和尾确是不一样的。下面说明。

首先是客户端使用的接口

IPrintable接口

public interface IPrintable{
    public void print();
}

设计一个可以供客户端使用的实现类:

Order发票打印类

public class Order implements IPrintable{
    public void print(){
        System.out.println("发票的主体部分");
    }
}

下面是装饰类。

OrderDecorator抽象类

public abstract class OrderDecorator implements IPrintable{
    private IPrintable printable;
    public OrderDecorator(IPrintable printable){
        super();
        this.printable=printable;
    }
    
    @Override
    public void print(){
        printable.print();
    }
}

HeaderDecorator装饰类

public class HeaderDecorator extends OrderDecorator{
    public HeaderDecorator(IPrintable printable){
        super(printable);
    }
    
    @Override
    public void print(){
        System.out.println("发票头部");
        super.print();
    }
}

FooterDecorator装饰类

public class FooterDecorator extends OrderDecorator{
    public FooterDecorator(IPrintable printable){
        super(printable);
    }
    
    @Override
    public void print(){
        super.print();
        System.out.println("发票尾部");
    }
}

客户端代码如下

Client类

public class Client{
    public static void main(String[] args){
        //测试原始类   
        IPrintable order=new Order();
        order.print();
        System.out.println("-----打印完毕-----");
        
        //测试装饰头部的类
        IPrintable headerOrder=new HeaderDecorator(new Order());
        headerOrder.print();
        System.out.println("-----打印完毕-----");
        
        //厕所装饰头部和尾部的类
        IPrintable headerAndFooterOrder=new HeaderDecorator(new FooterDecorator(new Order()));
        headerAndFooterOrder.pritn();
        System.out.println("-----打印完毕-----");
    }
}

 这是装饰模式的典型用法,看起来像是把一个对象一层一层包装起来一样。这也正是装饰模式的别名“包装器”的由来。

运行结果如下:

发票的主体部分

-----打印完毕-----

发票头部

发票的主体部分

-----打印完毕-----

发票头部

发票的主体部分

发票尾部

-----打印完毕-----



(end)