如何在无法修改第三方final类时实现桌子刻名的定制需求?
解决第三方Final类扩展功能的方案
这个场景太常见了——碰到第三方库的final类没法改也没法继承,又要加新功能,用**包装器模式(也叫装饰器模式的一种变体)**就完美解决,核心思路就是给原对象套一层实现了相同接口的“壳”,把新逻辑嵌进去。
具体步骤:
创建包装类实现目标接口
我们需要写一个类,实现和TableMaker一样的In_TableMaker接口,内部持有原In_TableMaker的实例,这样就能在不破坏原有逻辑的基础上添加新功能。示例代码:
public class NamedTableMaker implements In_TableMaker { private final In_TableMaker originalMaker; private final String customerName; // 构造时传入原maker和要刻的客户名字 public NamedTableMaker(In_TableMaker originalMaker, String customerName) { this.originalMaker = originalMaker; this.customerName = customerName; } @Override public Table makeTable() { // 先调用原maker的方法生成桌子 Table table = originalMaker.makeTable(); // 新增刻名字的逻辑 carveCustomerName(table); return table; } // 自定义刻名字的实现 private void carveCustomerName(Table table) { // 这里根据实际场景实现刻名字的逻辑,比如调用table的API或者模拟操作 System.out.println("Carving name '" + customerName + "' on table: " + table.getId()); } }替换原代码中的实例
原来的代码直接实例化TableMaker,现在换成我们的包装类,把原实例和客户名字传进去就行:// 按需传入不同客户的名字 String targetCustomerName = "Alice Smith"; In_TableMaker tableMaker = new NamedTableMaker(new TableMaker(), targetCustomerName); TableWorkshop workshop = new TableWorkshop(); workshop.makeAndDeliverTable(tableMaker);
为什么这个方案可行?
- 完全符合要求:没有修改第三方库的任何代码,也不需要继承final类,只修改了自己的业务代码。
- 兼容性拉满:
TableWorkshop依赖的是In_TableMaker接口,它根本感知不到我们的包装类存在,还是按原来的逻辑调用makeTable()方法。 - 扩展性强:以后如果还要加其他功能(比如给桌子喷漆、加抽屉),只需要再写新的包装类,组合起来用就行,不用动现有代码。
内容的提问来源于stack exchange,提问作者Arlex
相关产品推荐
相关产品推荐

