设计模式-装饰器模式


目录
  • 设计模式-装饰器模式
    • 定义
    • 适用场景
    • UML 类图
    • 代码实现
    • 优缺点

设计模式-装饰器模式

定义

是指在不改变原来对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。

属于结构型。

适用场景

  • 用于扩展一个类的功能或给一个类添加附加职责
  • 动态的给一个对象添加功能,这些功能可以再动态撤销

UML 类图

装饰器和被装饰对象都继承统一父类 Component

代码实现

package com.black.design.pattern.decorator;

/**
 * 父类组件
 * @author black
 *
 */
public abstract class Component {

    //操作
    public  abstract void operation();
}

package com.black.design.pattern.decorator;

/**
 * 被装饰者
 * @author black
 *
 */
public class ConcreteComponent extends Component {

    @Override
    public void operation() {
       System.out.println("做工作...");
    }

}

package com.black.design.pattern.decorator;

/**
 * 装饰器
 * @author black
 *
 */
public abstract class Decorator extends Component {
    
    private Component component;

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

}

package com.black.design.pattern.decorator;
/**
 * 工作渴了,喝口可乐
 * @author black
 *
 */
public class ConreteDecoratorDrink extends Decorator {

    public ConreteDecoratorDrink(Component c) {
        super(c);
    }
    
    @Override
    public void operation() {
        super.operation();
        System.out.println("这会儿有点渴了,喝了一口可乐;");
    }
    

    public void operationFirst() {
        System.out.println("第一步,首先...");
    }
    
    public void operationLast() {
        System.out.println("最后,...");
    }
}

package com.black.design.pattern.decorator;
/**
 * 好记性不如烂笔头,记一下笔记;
 * @author black
 *
 */
public class ConreteDecoratorNote extends Decorator {

    public ConreteDecoratorNote(Component c) {
        super(c);
    }
    
    @Override
    public void operation() {
        super.operation();
        System.out.println("好记性不如烂笔头,记一下笔记;");
    }
}

测试:

package com.black.design.pattern.decorator;

public class Client {

    public static void main(String[] args) {
        
        Component p;
        p= new ConcreteComponent();//先工作
        p = new ConreteDecoratorNote(p);//实时记笔记
        p = new ConreteDecoratorDrink(p);//喝口可乐
        p.operation();
    }
}


结果:

做工作...
好记性不如烂笔头,记一下笔记;
这会儿有点渴了,喝了一口可乐;

优缺点

优点:
装饰器是继承的有力补充,比继承更灵活。
通过使用不同的装饰类以及这些装饰类的排列组合,可实现不同的效果。
装饰器完全符合开闭原则。

缺点:
会产生更多的类,增加程序复杂性;
动态装饰,多层装饰时会很复杂。