`
michael1990
  • 浏览: 13993 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

装饰者模式

 
阅读更多

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

要点:

1. 装饰者和被装饰对象有相同的超类型。

2. 可以用一个或多个装饰者包装一个对象。

3. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。

4. 对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。

5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。

6. 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。在实际项目中可以根据需要为装饰者添加新的行为,做到“半透明”装饰者。

7. 适配器模式的用意是改变对象的接口而不一定改变对象的性能,而装饰模式的用意是保持接口并增加对象的职责。

 

结构:

 

定义一个component接口

public interface Component {
    void operation();
}

 

定义一个对象,可以给这个对象添加一些职责。

public class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("具体对象的操作");
    }
}

 

维持一个指向Component对象的引用,并定义一个与 Component接口一致的接口。

public class Decorator implements Component{
    private Component component;
    public Decorator(Component component){
        this.component = component;
    }
    @Override
    public void operation() {
        component.operation();
    }
}

 

装饰对象A加上自己的行为,以“贴上”附加的职责。

public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }
    public void operation(){           
        super.operation();       
        addBehavior();
    }
    private void addBehavior(){
        System.out.println("具体装饰对象A的操作");
    }
}

 

装饰对象B加上自己的行为,以“贴上”附加的职责。

public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }
    public void operation(){   
        super.operation();       
        addBehavior();
    }  
    private void addBehavior() {
        System.out.println("具体装饰对象B的操作");
    }
}

 

测试类:

public class Test {
    public static void main(String[] args) {
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA d1 = new ConcreteDecoratorA(c);
        ConcreteDecoratorB d2 = new ConcreteDecoratorB(c);
        d1.operation();
        d2.operation();
    }
}

输出结果:

具体对象的操作
具体装饰对象A的操作
具体对象的操作
具体装饰对象B的操作

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics