今天我们继续讲解一下设计模式中的另一种---装饰器模式.
一、定义及结构图
装饰器模式是指对已经存在的某些类进行装饰,来扩展一些功能,属于结构型模式.创建一个装饰类来包装原有的类以达到装饰的效果.其结构图如下所示:
- 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
三、总结
装饰器的价值就体现在“装饰”上,并不会改变原来对象的性质。当然以上功能也可以通过继承实现,但当一个对象出现一个功能就要创建出一个子类是很不合理的。装饰器模式动态添加功能,大大的提高了扩展性,也一定程度上降低了子类的数量,降低了耦合度。
上面就是装饰器的基本内容,希望对大家理解装饰器模式有所帮助!!!