装饰器模式

装饰器模式:
Decorator Pattern:就是动态地把职责附加到已有对象上去,实现功能扩展。这种特性,使得装饰者模式提供了比继承更具有弹性的解决方案。
例子:美国女孩
装饰器模式

// 抽象类 Girl
abstract class Girl {
    String description = "no particular";

    public String getDescription(){
        return description;
    }
}

// 美国女孩
class AmericanGirl extends Girl {
    public AmericanGirl() {
        description = "+AmericanGirl";
    }
}

// 国产妹子
class ChineseGirl extends Girl {
    public ChineseGirl() {
        description = "+ChineseGirl";
    }
}

// 装饰者
abstract class GirlDecorator extends Girl {
    public abstract String getDescription();
}

// 下面以美国女孩示例
// 给美国女孩加上金发
class GoldenHair extends GirlDecorator {

    private Girl girl;

    public GoldenHair(Girl g) {
        girl = g;
    }

    @Override
    public String getDescription() {
        return girl.getDescription() + "+with golden hair";
    }

}

// 加上身材高大的特性
class Tall extends GirlDecorator {

    private Girl girl;

    public Tall(Girl g) {
        girl = g;
    }

    @Override
    public String getDescription() {
        return girl.getDescription() + "+is very tall";
    }

}


// 检验一下
public class Test {

    public static void main(String[] args) {
        Girl g1 = new AmericanGirl();
        System.out.println(g1.getDescription());

        GoldenHair g2 = new GoldenHair(g1);
        System.out.println(g2.getDescription());

        Tall g3 = new Tall(g2);
        System.out.println(g3.getDescription());

        // 你也可以一步到位
        // Girl g = new Tall(new GoldenHair(new AmericanGirl())); 
    }
}

输出:

+AmericanGirl
+AmericanGirl+with golden hair
+AmericanGirl+with golden hair+is very tall

**总结:**当需要动态地给一个对象添加功能,实现功能扩展的时候,就可以使用装饰者模式。

装饰器模式和适配器模式区别:
1.关于新职责:适配器也可以在转换时增加新的职责,但其主要目的并不在此,而装饰器模式的主要目的,就是给被装饰者增加新职责用的。
2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统来说是不可见或不可用的;而装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。
3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是哪个类或哪个接口);而装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。