static public void Main() { //正常情况下,具体做X事。 ConcretComponent cc = new ConcretComponent(); cc.DoSth(); //现在想让组件类,除了能做X事,还能做A事。 //此时不用修改这个组件类。 //而是将其放入具体装饰器(或称为“包装器”更贴切)中。 ConcreteDecoratorA cdA = new ConcreteDecoratorA(cc); ConcreteDecoratorB cdB = new ConcreteDecoratorB(cc); ConcreteDecoratorB cdC = new ConcreteDecoratorB(cc); cdA.DoSth(); //既能干X、又能干A cdB.DoSth(); //既能干X、又能干B cdC.DoSth(); //既能干X、又能干C //------------------------------------------------------------------ //除了上边那样简单的单层装饰,还能进行任意组合的装饰 new ConcreteDecoratorB(cdA).DoSth(); //既能干X、又能干A、又能干B new ConcreteDecoratorA(cdB).DoSth(); //同上,顺序变化 new ConcreteDecoratorC(cdA).DoSth(); //既能干X、又能干A、又能干C new ConcreteDecoratorA(cdC).DoSth(); //同上,顺序变化 new ConcreteDecoratorC(cdB).DoSth(); //既能干X、又能干B、又能干C new ConcreteDecoratorB(cdC).DoSth(); //同上,顺序变化 new ConcreteDecoratorA(new ConcreteDecoratorB(cdC)).DoSth(); //既能干X、又能干A、又能干B、又能干C new ConcreteDecoratorA(new ConcreteDecoratorC(cdB)).DoSth(); //同上,顺序变化 new ConcreteDecoratorB(new ConcreteDecoratorA(cdC)).DoSth(); //同上,顺序变化 new ConcreteDecoratorB(new ConcreteDecoratorC(cdA)).DoSth(); //同上,顺序变化 new ConcreteDecoratorC(new ConcreteDecoratorA(cdB)).DoSth(); //同上,顺序变化 new ConcreteDecoratorA(new ConcreteDecoratorB(cdA)).DoSth(); //同上,顺序变化 //------------------------------------------------------------------ //甚至可以同方法多次装饰 new ConcreteDecoratorA(cdA).DoSth(); new ConcreteDecoratorA(new ConcreteDecoratorA(cdA)).DoSth(); }