装饰器模式(Decorator Pattern)允许向一个现在的对象添加新功能,而有不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
装饰器模式(Decorator Pattern),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更灵活。 ----《大话设计模式》

组件(Component):组件接口定义了全部组件类和装饰器实现的行为;
组件实现类(ConcreteComponent):实现Component接口,组件实现类就是被装饰器装饰的原始对象,新功能或者附加功能都是通过装饰器添加到该类的对象上的;
装饰器抽象类(Decorator):实现Component接口的抽象类,在其中封装了一个Component 对象,也就是被装饰的对象;
具体装饰器类(ConcreteDecorator):该实现类要向被装饰的对象添加某些功能;

代码示例
首先创建一个电脑的接口,给出两个抽象方法,分别是获取名字和获取价格:
/**
* 装饰者模式中的Component
* Created by dukun on 2019/11/14.
*/
public interface IComputer {
String computerName();
double price();
}
创建一个初始化电脑类实现上面的接口,这个对象就是原始对象,要被装饰的:
/**
* 被装饰的对象。原对象
* Created by dukun on 2019/11/14.
*/
public class Computer implements IComputer {
@Override
public String computerName() {return "初始化的电脑";}
@Override
public double price() {return 1000;}
}
现在有一个需求就是需要给这台普通的电脑加一个内存或是加一个硬盘,即在现有的基础上对该电脑进行装饰。
首先需要创建一个装饰类接口来确定加入的是哪种配置,这样逻辑上是说得通的,电脑配件依附于电脑,和电脑有相同的属性。装饰器抽象类(Decorator):
/**
* 装饰类接口
* Created by dukun on 2019/11/14.
*/
public interface Device extends IComputer {
}
具体装饰器类(ConcreteDecorator): 分别创建装饰类的实现类来定义具体装饰内容
/**
* 具体的装饰者 加内存的装饰者
* Created by dukun on 2019/11/14.
*/
public class MemoryDecorator implements Device {
private IComputer computer;
public MemoryDecorator(IComputer computer){this.computer=computer;}
@Override
public String computerName() {return computer.computerName()+";升级配置加4G内存";}
@Override
public double price() {return computer.price()+500;}
}
/**
* 具体的装饰者
* Created by dukun on 2019/11/14.
*/
public class HardDisk implements Device{
private IComputer computer;
public HardDisk(IComputer computer){this.computer=computer;}
@Override
public String computerName() {
return computer.computerName()+";电脑升级配置加硬盘";
}
@Override
public double price() {
return computer.price()+500;
}
}
/**
*CPU装饰类
* Created by dukun on 2019/11/14.
*/
public class Cpu implements Device {
private IComputer computer;
public Cpu(IComputer computer) { this.computer = computer;}
@Override
public String computerName() {return computer.computerName()+";更换cpu";}
@Override
public double price() {return computer.price()+1000;}
}
最后写一个demo来看一下装饰效果如何:
/**
* Created by dukun on 2019/11/14.
*/
public class DecoratorTest {
public static void main(String[] args) {
//配置一个电脑加内存和硬盘
IComputer computer = new HardDisk(new MemoryDecorator(new Computer()));
System.out.println(computer.computerName()+":价格:"+computer.price());
//配置一个电脑电脑加内存和硬盘 更换cpu
IComputer computer1 = new Cpu(new HardDisk(new MemoryDecorator(new Computer())));
System.out.println(computer1.computerName()+":价格:"+computer1.price());
}
}
测试效果:

总结:
装饰器的价值就体现在“装饰”上,他只是装饰,并不会改变原来对象的性质。当然,以上功能也可以通过继承实现,但当一个对象出现一个新的功能就要创建一个子类这样是不合理的。装饰器模式动态添加功能大大提高了拓展性,一定程度上降低了子类的数量,降低了耦合度。
本文深入解析装饰器模式,一种允许在不改变对象结构的前提下为其添加新功能的设计模式。通过实例展示如何动态为对象添加职责,增强代码的灵活性与扩展性。
380

被折叠的 条评论
为什么被折叠?



