本文主要是介绍Java 中使用装饰器模式 wrapped 一个不能被重写的父类中的接口方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在开发中,有时候使用第三方框架时,我们因为特殊需求,需要继承框架中的一个Java类重写它的某个方法来达到期望的目的。
如果需要被重写的方法被使用 final 修饰了,这种情况下我们是无法直接继承这个类来重写这个方法的。
本文所述场景不一定符合大部分场景,针对如下接口和类的关系的这种场景,是可以通过装饰器模式构造一个 wrapped 类成员变量来变相重写接口方法,接口和类的关系如下:
public interface InterfaceA {void show1(); void show2();
}
public class ClassA implements InterfaceA {@Overridepublic final void show1() {System.out.println("show1被调用,方法使用final修饰");}@Overridepublic void show2() {System.out.println("show2被调用");}
}
类 ClassA 实现了 InterfaceA 的所有方法,然后把 show1 给固定位不可再重写。
现在需要需要创建一个 ClassB 继承 ClassA ,并希望重写 show1(),正常来说是不可以的。
现在,可以按照下面的代码示例来曲线重写 show1 方法,ClassB 的代码如下:
public class ClassB extends ClassA {private final InterfaceA wrapped;public ClassB() {this.wrapped = new InterfaceA() {@Overridepublic void show1() {System.out.println("show1被重写");}@Overridepublic void show2() {ClassB.this.show2();}};}public InterfaceA getInterfaceA() {return wrapped;}@Overridepublic void show2() {System.out.println("show2被子类重写");}
}
我们在 ClassB 中声明了一个 wrapped 变量,完全重新实现了接口 InterfaceA,重点是我们在所有的接口方法中,直接调用 ClassB 的所有对应方法,这样就相当于 wrapped 装饰了原来 ClassB 实例中的 InterfaceA,此时我们只需要对 show1 进行复写自己的逻辑即可,其他方法原样返回。
对应测试类如下:
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)
这篇关于Java 中使用装饰器模式 wrapped 一个不能被重写的父类中的接口方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!