首页 > 代码库 > 穿什么有这么重要?——装饰模式

穿什么有这么重要?——装饰模式

装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就是增加功能来说,装饰模式比生成子类更为灵活。

装饰模式(Decorator)结构图

技术分享

   Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。

Component类

 

abstract class Component{    public abstract void Operation();}

 

ConcreteComponent类

class ConcreteComponent extends Component{    public void Operation(){        //具体对象的操作    }}

Decorator类

class Decorator extends Component{    protected Component component;        public void SetComponet(Component component){        this.component = component;    }        public void Operation(){        if(component != null){            component.Operation();        }    }    }

ConcreteDecoratorA类

class ConcreteDecoratorA extends Decorator{    private string addedState;        base.Operation();    addedState = "New State";    //具体装饰对象A的操作    }class ConcreteDecoratorB extends Decorator{    public void Operation(){        base.Operation();        AddedBehavior();        //具体装饰对象B的操作    }        private void AddedBehavior(){        //本类独有的方法,以区别与ConcreteDecoratorA    }    }

客户端代码:

static void Main(String[] args){    ConcreteComponent c = new ConcreteComponent();    ConcreteDecoratorA d1 = new ConcreteDecoratorA();    ConcreteDecoratorB d2 = new ConcreteDecoratorB();    //装饰方法:首先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c    //然后利用ConcreteDecoratorA的实例化对象d1来包装c,再利用ConcreteDecoratorB的对象d2包装d1,    //最终执行d2的Operation()    d1.SetComponet(c);    d2.SetComponet(d1);    d2.Operation();}

  装饰模式是利用SetComponent来对对象进行包装,这样每个装饰对象的实现就和如何利用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

 

穿什么有这么重要?——装饰模式