码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-29 10:21:57      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/chuji1988/p/4257339.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!