装饰器模式(包裹模式)
装饰器模式的形象理解油漆工刷油漆。油漆工是装饰器角色,被刷者是被装饰器角色。
装饰器分四个角色
抽象构件角色:增加附加功能的一个抽象接口。也就是被装饰的一个抽象角色。
具体构件角色:抽象构件角色的实现类。
装饰器角色:持有抽象构件觉得一个变量引用。切也要与抽象构件角色同一接口。
具体装饰器角色:装饰器角色的实现类。具体附加功能到抽象角色。
说了这么多。。还是用实例来描述比较形象。下面一女孩子不同穿着来说明
譬如女孩子喜欢穿裙子。喜欢咋马尾辫。不同打扮。但是这个女孩子还是没有变。
//女孩接口
public interface Girl{
?? //女孩子逛街行为
?? public void goShopping();
}
//具体实现类?
public class Interface GirlImpl{
?? public void goShopping(){
???? System.out.println("今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈");
?}
}
?
//装饰器的抽象类。定义抽象的父类接口
public interface DecorationGirl extends Girl{
?
}
?
//穿LV 裙子的装饰的女孩子
public class SkirtDecorationGirl implements DecorationGirl{
? //女孩子对象的引用属性
? private Girl girl;
??
? public SkirtDecorationGirl(Girl girl){
?????? this.girl=girl;
?}
? private void wearSkirt(){
??? System.out.println("亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...");
}
?
public void goShopping(){
?? wearSkirt();
?? girl.goShopping();
}
}
?//既穿LV裙子。又骑捷安特的自行车的女孩子。还是女孩子
public class GiantBikeGirl extends SkirtDecoration{
??? public GiantBikeGirl(Girl girl){
???????? super(girl);
?? }
?
?? private void bikeGiant(){
???????? System.out.println("我今天要骑你送给我的捷安特的自行车。这车好便宜啊。才5000多!");
}
?
?public void goShopping(){
?????????bikeGiant();
?????????girl.goShopping();
}
}
?
//客户端调用
public class Client{
?? public static void main(String arg[]){
??? Girl girl = new GirlImpl();
??? Girl skirtGirl = new SkirtDecorationGirl (girl);
?? Girl giantGirl = new GiantBikeGirl(skirtGirl);
??? //只穿裙子的女孩子逛街
? ?skirtGirl.goShopping();
?? //又穿裙子。又骑自行车的女孩子逛街
? giantGirl.goShopping();
?}
}
?
//穿裙子逛街的女孩子
亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...
今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈
//既骑车又穿裙子的逛街的女孩子
我今天要骑你送给我的捷安特的自行车。这车好便宜啊。才5000多!"
亲爱的,谢谢你。我今天要穿你送给我的LV裙子逛街...
今天我就逛逛街,亲爱的陪陪我嘛,陪我,我就嫁给你...哈哈
GiantBikeGirl 和SkirtDecorationGirl 可以任意组合。可以得出不同打扮的女孩子逛街。总之不管是什么穿着。都是这个女 孩子。不会改变。
应用场景:
1,?需要扩展一个类的功能或者附件责任同时也可以撤销一个类的动态的功能。
2.需要增加一些基本的功能的排列组合而产生的大量的功能时。
有点:
1,很方便的扩展一个类的功能。同时比继承更具灵活性。
2.可以排列组合装饰类产生大量的新增功能。
缺点:
?由于装饰器类设计组合灵活性导致比继承更容易出错。
备注:装饰器的模式的核心就是接口要统一.基本行为还是抽象构件的行为。所以要持有被装饰角色的引用。