예제 #1
0
        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();
        }