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

来源:互联网 发布:怎么在淘宝上买av种子 编辑:程序博客网 时间:2024/06/05 17:15
装饰者模式,名字很贴切,装饰一词,本来就是在原有的基础上增添点东西。而在软件领域,增加功能是一件多么常见的事情。策划最常说的就是,“你看下,这里能不能加个.....”,QA的绩效考核上,还要包含建议数目,如果都要完成这些建议,那么开发的工作量可能就翻了一倍哈哈哈。
对比继承方式带来的强依赖而言,以及父类变更对子类的影响之大,装饰者取了巧,虽然从抽象意义上,装饰者不是事实意义上的“孩子”类(或者说抽象对应的具体),但是为了使得可以在组件对象的基础上一层层的增加新的内容,也就是装饰者还可以被其他的装饰者再次装饰,那么将这些类都抽象出相同的父类来说是一种比较好的方式。来看下装饰模式的图(来源:设计模式之禅):

来看下代码示例:
/** * 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();    }}

执行结果:


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

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

0 0
原创粉丝点击