结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)

装饰者模式,名字很贴切,装饰一词,本来就是在原有的基础上增添点东西。而在软件领域,增加功能是一件多么常见的事情。策划最常说的就是,“你看下,这里能不能加个.....”,QA的绩效考核上,还要包含建议数目,如果都要完成这些建议,那么开发的工作量可能就翻了一倍哈哈哈。
对比继承方式带来的强依赖而言,以及父类变更对子类的影响之大,装饰者取了巧,虽然从抽象意义上,装饰者不是事实意义上的“孩子”类(或者说抽象对应的具体),但是为了使得可以在组件对象的基础上一层层的增加新的内容,也就是装饰者还可以被其他的装饰者再次装饰,那么将这些类都抽象出相同的父类来说是一种比较好的方式。来看下装饰模式的图(来源:设计模式之禅):
结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)_第1张图片
来看下代码示例:
/**
 * Create by zxb on 2017/4/25
 */
public abstract class Component {
    public abstract void doSomething();
}

/**
 * Create by zxb on 2017/4/25
 */
public class ConcreteComponent extends Component {

    public void doSomething() {
        System.out.println("Here's in ConcreteComponent doSomething ! ");
    }
}

/**
 * Create by zxb on 2017/4/25
 */
public class Decorator1 extends Component {

    private  Component component;

    public Decorator1(Component component){
        this.component = component;
    }

    public void doSomething() {
        this.component.doSomething();
        System.out.println("Here's in Decorator1 ! ");
    }
}

/**
 * Create by zxb on 2017/4/25
 */
public class Decorator2 extends Component {

    private  Component component;

    public Decorator2(Component component){
        this.component = component;
    }

    public void doSomething() {
        this.component.doSomething();
        System.out.println("Here's in Decorator2 ! ");
    }
}

/**
 * Create by zxb on 2017/4/25
 */
public class DecoratorTest {
    public static void main(String[] args){
        ConcreteComponent component = new ConcreteComponent();
        component.doSomething();
        System.out.println();
       Decorator1 decorator1 = new Decorator1(component);
        decorator1.doSomething();
        System.out.println();
        Decorator2 decorator2 = new Decorator2(decorator1);
        decorator2.doSomething();
    }
}

执行结果:
结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)_第2张图片

可以看到原来只打印一句,然后装饰完以后,多了一句Decorator1的内容,再装饰一层,又 多了一句Decorator2的内容

我们可以推想出装饰模式的优点是:
1)在组件类的基础上动态、透明(组件类并不知道这个类)的扩展功能,提供了一种继承之外的替代方案;
2)在不能使用继承的场景,比如类被final修饰的情形,可以选择使用装饰类来扩展功能;
缺点是但当装饰层次过多时,这时候系统的复杂性就会提高,所以在实际时尽量避免装饰超过3层吧,否则应该考虑其他方案来处理。

你可能感兴趣的:(设计模式专题)