1: 作用
动态的给对象增加执行的业务,不受数量限制。可以代替子类,同时避免子类与父类的高耦合。增加灵活性。
2:构成
2.1 装饰者抽象类--Decorator (可以是接口)
最终生成一个指向被装饰对象基类(Component)实例的引用,并定义一个与被装饰对象基类(Component)接口一致的接口。
通过这个抽象类或接口来指向具体的执行对象。
2.2 被装饰的对象的基类--Component
放在最里面核心的位置,用来生成基础的被装饰对象,可以给这个对象动态的添加职责。
2.3具体被装饰对象--ConcreteComponent
生成具体的装饰对象,其属性中包含一个装饰者抽象类Decorator对象,一般拥有一个含参的构造方法,参数为一个装饰者抽象类Decorator对象,用来设置属性中的装饰者抽象类Decorator对象。
2.4 具体的装饰者 - ConcreteDecorator
最终的操作者,给内部的被装饰的对象增加(装饰对象的)职责。
3 例
目的:造一座房子 ; 装饰:门,窗,床。
可以任意的给这座房子装饰 门,窗,床中的一种或几种。顺序也可以改变。
//装饰者抽象类
public interface Build {
public void act();
}
//具体装饰
public class BuildBed implements Build {
Build bud;
public BuildBed(Build bu){
this.bud = bu;
}
@Override
public void act() {
// TODO Auto-generated method stub
System.out.println("造一架床");
this.bud.act();
}
}
//具体装饰
public class BuildDoor implements Build {
Build bud;
public BuildDoor(Build bu){
this.bud = bu;
}
@Override
public void act() {
// TODO Auto-generated method stu
System.out.println("修一个门");
this.bud.act();
}
}
//具体装饰
public class BuildWindow implements Build {
Build bud;
public BuildWindow(Build bu){
this.bud = bu;
}
@Override
public void act() {
// TODO Auto-generated method stub
System.out.println("修一个窗");
this.bud.act();
}
}
//具体被装饰对象
public class House implements Build {
@Override
public void act() {
System.out.println("造一座房子");
}
}
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//修一个门;修一个窗;造一座房
Build bud1 = new BuildDoor(new BuildWindow(new House()));
bud1.act();
//造一架床;修一个窗;修一个门,造一座房
Build bud2 = new BuildBed( new BuildWindow(new BuildDoor( new House())));
bud2.act();
}
}
具体装饰之上可以抽象出一层装饰者抽象类。