概述
装饰器模式 : 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{@Overridepublic void generatElectronProduct() {System.out.println("生产电脑。。。");}
}
装饰器
抽象类/基类
public abstract class ELectronicDecorator implements ElectronProduct{protected ElectronProduct electronProduct;public ELectronicDecorator(ElectronProduct electronProduct) {this.electronProduct = electronProduct;}// 对接口中的方法进行实现,也可以做成抽象的@Overridepublic void generatElectronProduct() {electronProduct.generatElectronProduct();}
}
具体实现类-可以有多个
public class ComputerDecorator extends ELectronicDecorator{public ComputerDecorator(ElectronProduct electronProduct) {super(electronProduct);}@Overridepublic void generatElectronProduct() {electronProduct.generatElectronProduct();System.out.println("增加电脑装饰-安装软件");}
}
public class ComputerDecorator2 extends ELectronicDecorator{public ComputerDecorator2(ElectronProduct electronProduct) {super(electronProduct);}@Overridepublic 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();// 后续还可以继续添加装饰}
}
运行结果:
生产电脑。。。===============
生产电脑。。。
增加电脑装饰-安装软件===============
生产电脑。。。
增加电脑装饰-安装软件
增加电脑装饰-增强音响