包装器是一种通用的编程概念,指用一个对象或函数来封装另一个对象或函数,以提供额外的功能、修改其行为或适应不同的接口
假设我们有一个抽象类
class Printer {
print() {
console.log("基础打印功能");
}
}
基于抽象类实现一个具体类
class ConsolePrinter extends Printer {
print() {
console.log("在控制台打印内容");
}
}
我们想要一个类 可以基于 ConsolePrinter 做修改,在 console.log("在控制台打印内容"); 前打印 "这是新功能"
方法1:直接修改原来的类
如果有别的地方用到原来的类,会影响到原来的类 且需求修改的时候 这里要再次修改
方法2:写一个新类 重写里面的print方法
确实不会影响别的类 但是这里依旧是耦合的
方法3:使用包装器
解决上面的痛点
- 不耦合 灵活可维护
- 符合开闭原则:对扩展开放,对修改封闭
以下为代码实现
class PrinterWrapper extends Printer {
constructor(printer) {
super(); // 调用父类构造函数
this.wrappedPrinter = printer; // 保存被包装的对象
}
// 重写print方法,扩展功能
print() {
console.log("这是新功能");
this.wrappedPrinter.print(); // 调用被包装对象的原始功能
}
}
// 使用示例
const consolePrinter = new ConsolePrinter();
const wrappedPrinter = new PrinterWrapper(consolePrinter);
consolePrinter.print();
wrappedPrinter.print();