概述
装饰器模式 : Decorator Pattern : 是一种结构型设计模式.
作用 : 允许你动态地给对象添加功能或职责
,而无需修改其原始类的代码
,非常的符合开闭原则
。
实现思路 :通过创建一个包装对象(即装饰器),来包裹原始对象,并在运行时动态地为这个对象增加新的行为。
简单理解 : 就是一层一层的包装起来。
核心思想
1、开放封闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。
装饰器模式很好地体现了这一原则,它允许我们在不改变已有代码的情况下,通过添加新的装饰器类来扩展功能。
2、避免继承层次过多:如果使用继承来实现功能扩展,可能会导致子类数量爆炸式增长。而使用装饰器模式可以有效地减少这种复杂性。
主要角色
1、Component(组件):定义了被装饰的对象接口,可以是一个具体类或抽象类。
2、ConcreteComponent(具体组件):实现了Component接口的具体类,是我们希望装饰的对象。
3、Decorator(装饰器):持有一个Component对象的引用,并且定义了一个与Component相同的接口,使得Decorator可以替代具体的组件。
4、ConcreteDecorator(具体装饰器):实现了Decorator接口,并在其基础上添加了额外的行为或功能。
情景模式
1、有一些企业是 做电子产品的,可以生产各种各样的电子产品 - 抽象的组件;
2、有一家企业是 专门生产电脑的 - 具体的组件;
3、有一些企业是做 音响的,可以给电脑配置音响 - 装饰器;
4、有一家企业是 专门给电脑定制音响的 - 具体装饰器。
5、有一些企业是做 软件的,可以给电脑安装软件 - 装饰器;
6、有一家企业是 专门给电脑做 聊天软件的 - 具体的装饰器。
类图
案例代码
被装饰者-组件
接口类
public interface ElectronProduct {
void generatElectronProduct();
}
具体实现类
public class ComputerProduct implements ElectronProduct{
@Override
public void generatElectronProduct() {
System.out.println("生产电脑。。。");
}
}
装饰器
抽象类/基类
public abstract class ELectronicDecorator implements ElectronProduct{
protected ElectronProduct electronProduct;
public ELectronicDecorator(ElectronProduct electronProduct) {
this.electronProduct = electronProduct;
}
// 对接口中的方法进行实现,也可以做成抽象的
@Override
public void generatElectronProduct() {
electronProduct.generatElectronProduct();
}
}
具体实现类-可以有多个
public class ComputerDecorator extends ELectronicDecorator{
public ComputerDecorator(ElectronProduct electronProduct) {
super(electronProduct);
}
@Override
public void generatElectronProduct() {
electronProduct.generatElectronProduct();
System.out.println("增加电脑装饰-安装软件");
}
}
public class ComputerDecorator2 extends ELectronicDecorator{
public ComputerDecorator2(ElectronProduct electronProduct) {
super(electronProduct);
}
@Override
public void generatElectronProduct() {
electronProduct.generatElectronProduct();
System.out.println("增加电脑装饰-增强音响");
}
}
测试类
public class Test {
public static void main(String[] args) {
// 1、最原始的对象
ElectronProduct electronProduct = new ComputerProduct();
electronProduct.generatElectronProduct(); // 原生的方法
System.out.println(" =============== ");
// 2、添加一层装饰
ELectronicDecorator eLectronicDecorator = new ComputerDecorator(electronProduct);
eLectronicDecorator.generatElectronProduct(); // 装饰器对象的方法,将原来的方法进行了增强
System.out.println(" =============== ");
// 3、再多一层装饰
ELectronicDecorator eLectronicDecorator2 = new ComputerDecorator2(eLectronicDecorator);
eLectronicDecorator2.generatElectronProduct();
// 后续还可以继续添加装饰
}
}
运行结果:
生产电脑。。。
===============
生产电脑。。。
增加电脑装饰-安装软件
===============
生产电脑。。。
增加电脑装饰-安装软件
增加电脑装饰-增强音响