设计模式-装饰器模式

参考网站

http://www.runoob.com/design-pattern/factory-pattern.html

什么是装饰器模式?

装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构性模式,他是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

下面的这个例子,就是对一块面包进行装饰。面包大同小异,但是它有不同的口味,如美式面包,法式面包等等。就是通过在同一块普通面包的基础上进行装饰,因为口味不同,有的加的东西又不一样。但是通过装饰器模式就能很好地解决这种问题。

使用方法

动态的给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

步骤

创建一个接口

Bread.java 面包类

public interface Bread {
    public void show();//面包显示
}

创建需要装饰的实体类

AmericanBread.java 美式面包

public class AmericanBread implements Bread {
    private double money = 5.2;
    
    @Override
    public void cost() {
        // TODO Auto-generated method stub
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub
        System.out.println("AmericanBread");
    }

}

创建实现了面包接口的装饰器类

BreadDecorator.java 面包装饰器类

public class BreadDecorator implements Bread {
    private Bread bread;
    
    public BreadDecorator(Bread bread) {
        this.bread = bread;
        // TODO Auto-generated constructor stub
    }
    @Override
    public void show() {
        // TODO Auto-generated method stub
        bread.show();
    }

}

创建拓展了BreadDecorator类的实体装饰类

GarlicDecorator.java 大蒜装饰类

public class GarlicDecorator extends BreadDecorator{
    public GarlicDecorator(Bread bread){
        super(bread);
        addGarlic(bread);
    } 
    
    public void addGarlic(Bread bread){
        System.out.println("加蒜");
    }
}

客户端使用GarlicDecorator类来装饰Bread对象

Client.java 客户端类

public class Client {
    
    public static void main(String ars[]){
        Bread americanBread = new AmericanBread();
        
        Bread garlicAmericanBread = new GarlicDecorator(americanBread);
        garlicAmericanBread.show();
    }
}

推荐阅读更多精彩内容