Java 中使用装饰器模式 wrapped 一个不能被重写的父类中的接口方法

在开发中,有时候使用第三方框架时,我们因为特殊需求,需要继承框架中的一个Java类重写它的某个方法来达到期望的目的。

如果需要被重写的方法被使用 final 修饰了,这种情况下我们是无法直接继承这个类来重写这个方法的。

本文所述场景不一定符合大部分场景,针对如下接口和类的关系的这种场景,是可以通过装饰器模式构造一个 wrapped 类成员变量来变相重写接口方法,接口和类的关系如下:

java 复制代码
public interface InterfaceA {
    void show1();    
    void show2();    
}
java 复制代码
public class ClassA implements InterfaceA {
    @Override
    public final void show1() {
        System.out.println("show1被调用,方法使用final修饰");
    }
    @Override
    public void show2() {
        System.out.println("show2被调用");
    }
}

类 ClassA 实现了 InterfaceA 的所有方法,然后把 show1 给固定位不可再重写。

现在需要需要创建一个 ClassB 继承 ClassA ,并希望重写 show1(),正常来说是不可以的。

现在,可以按照下面的代码示例来曲线重写 show1 方法,ClassB 的代码如下:

java 复制代码
public class ClassB extends ClassA {
    private final InterfaceA wrapped;
    public ClassB() {
        this.wrapped = new InterfaceA() {
            @Override
            public void show1() {
                System.out.println("show1被重写");
            }
            @Override
            public void show2() {
                ClassB.this.show2();
            }
        };
    }
    public InterfaceA getInterfaceA() {
        return wrapped;
    }
    @Override
    public void show2() {
        System.out.println("show2被子类重写");
    }
}

我们在 ClassB 中声明了一个 wrapped 变量,完全重新实现了接口 InterfaceA,重点是我们在所有的接口方法中,直接调用 ClassB 的所有对应方法,这样就相当于 wrapped 装饰了原来 ClassB 实例中的 InterfaceA,此时我们只需要对 show1 进行复写自己的逻辑即可,其他方法原样返回。

对应测试类如下:

java 复制代码
public class OverrideTest {

    public static InterfaceA newInterfaceA() {
//        return new ClassB();
        return new ClassB().getInterfaceA();
    }

    public static void main(String[] args) {
        InterfaceA interfaceA = newInterfaceA();

        interfaceA.show1();
        interfaceA.show2();
    }

}

(END)

相关推荐
爬山算法2 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7253 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎3 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄3 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds3 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹3 小时前
【Java基础】多态 | 打卡day2
java·开发语言
Re.不晚3 小时前
JAVA进阶之路——无奖问答挑战2
java·开发语言
Ro Jace4 小时前
计算机专业基础教材
java·开发语言
mango_mangojuice4 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习