You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无法修改第三方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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:18:25