装饰者模式--设计模式

今天我们继续讲解一下设计模式中的另一种---装饰器模式.

一、定义及结构图

装饰器模式是指对已经存在的某些类进行装饰,来扩展一些功能,属于结构型模式.创建一个装饰类来包装原有的类以达到装饰的效果.其结构图如下所示:

  • Component为统一的接口,也是被装饰类和装饰类的基本.
  • ConcreteComponent为具体实现类, 也是被装饰类,他本身是个具有一定功能的完整的类.
  • Decorator是装饰类,实现了Component接口的同时还维护了一个实例,并可以经过构造函数初始化。而Decorator本身,存在仅仅是一个生命
  • ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰了哪种类型的ConcreteComponent,从而对其进行装饰。

二、实例讲解

我们以一个电脑配置的例子说明。

首先创建一个电脑的接口,给出两个抽象方法,分别是获取电脑的名字和获取价格:

/**
 * 抽象电脑类
 * 
 */
public interface AbstractComputer {
    String name();
    double price();
}

创建一个普通电脑类实现上面的接口:

/**
 * 普通电脑类
 * 
 */
public class Computer implements AbstractComputer {
    @Override
    public String name() {
        return "普通电脑";
    }

    @Override
    public double price() {
        return 3000;
    }
}

现在有一个需求是需要给普通的电脑加一个内存和硬盘,即在现有的基础上对该电脑进行装饰。

首先需要创建一个装饰类接口来确定加入的是哪一种配置,电脑配件依附于电脑和电脑有相同的属性。

/**
 * 装饰类接口
 * 
 */
public interface Device extends AbstractComputer {
    String name();
    double price();
}

分别创建装饰类的实现类来定义具体装饰内容:

/**
 * 内存类
 * 
 */
public class Memory implements Device {
    public AbstractComputer computer;

    public Memory(AbstractComputer computer) {
        this.computer = computer;
    }

    @Override
    public String name() {
        return computer.name()+"加内存";
    }

    @Override
    public double price() {
        return computer.price()+300;
    }
}
/**
 * 硬盘类
 * 
 */
public class HardDisk implements Device {
    public AbstractComputer computer;

    public HardDisk(AbstractComputer computer) {
        this.computer = computer;
    }
    @Override
    public String name() {
        return computer.name()+"加硬盘";
    }

    @Override
    public double price() {
        return computer.price()+500;
    }
}

然后我们写一个demo来看下装饰效果如下:

public class DecoratorPatternDemo {

    public static void main(String[] args) {

        //创建普通的电脑
        Computer computer = new Computer();

        //给普通电脑加硬盘
        HardDisk hardDisk = new HardDisk(computer);
        System.out.println(hardDisk.name());
        System.out.println(hardDisk.price());

        //给普通电脑加内存
        Memory memory = new Memory(computer);
        System.out.println(memory.name());
        System.out.println(memory.price());

        //给普通电脑加硬盘和内存
        Memory memory1 = new Memory(hardDisk);
        System.out.println(memory1.name());
        System.out.println(memory1.price());

    }

}

输出结果:

普通电脑加硬盘
3500.0
普通电脑加内存
3300.0
普通电脑加硬盘加内存
3800.0

三、总结

装饰器的价值就体现在“装饰”上,并不会改变原来对象的性质。当然以上功能也可以通过继承实现,但当一个对象出现一个功能就要创建出一个子类是很不合理的。装饰器模式动态添加功能,大大的提高了扩展性,也一定程度上降低了子类的数量,降低了耦合度。

上面就是装饰器的基本内容,希望对大家理解装饰器模式有所帮助!!!

原文地址:https://www.cnblogs.com/guohai-stronger/p/11842867.html