直接进行话题,开始我们的梦人自语。
望我的文章能够让你对代理模式有所顿悟,对他的使用有所了解,我也就达到我编作的目的了。
- 出现原因
- 过程简述
- 例子
出现原因:
我们都知道在装饰者模式中,表现出他解决 在 原有基础上扩展的能力,但是还是略有缺陷就是当扩展类的接口类方法过于多,将会导致我们所扩展后的类过于冗余。如不了解可以看,我上一期介绍的装饰模式
过程简述:
动态创建字节码文件
在这里我们显示的就是复制一个class字节码文件 首先知道我们清楚 装饰着模式,我们需要实现接口类 然后我们把接口类的方法先进行复制进去,然后还有我们要实现类的类加载器作为我们的主角,然后在采取回调的方式,每当我们在由我们所创建的 class字节码文件所得到的对象调用方法的时候,会进行回调,此时我们对那些我们不想扩展的类直接进行反射然后进行使用就可以,对于那些我们想扩展的类我们进行扩展后,在映射使用原来的类 ,这样就可以解决修饰者模式的弊端。
例子:
待扩展得类
public final class GoogleCar implements ICar{
public void fly(){}
@Override
public String start(int a,int b) {
System.out.println("控制谷歌的汽车启动");
//调用谷歌汽车提供的C语言函数
return "start...."+a+" "+b;
}
@Override
public void run() {
System.out.println("控制谷歌的汽车运行");
}
@Override
public void stop() {
System.out.println("控制谷歌的汽车停止");
}
}
接口类
public interface ICar {
public String start(int a,int b);
public void run();
public void stop();
}
我们的扩展后的结果
public class TestCar {
public static void main(String[] args) {
//1param: 固定值: 告诉虚拟机用哪个字节码加载器加载内存中创建出的字节码文件
//2param: 告诉虚拟机内存中正在被创建的字节码文件中应该有哪些方法
//3param: 告诉虚拟机正在被创建的字节码上的各个方法如何处理
ICar car=(ICar)Proxy.newProxyInstance(TestCar.class.getClassLoader(), GoogleCar.class.getInterfaces(),new InvocationHandler() {
//method:代表正在执行的方法
//args:代表正在执行的方法中的参数
//Object:代表方法执行完毕之后的返回值
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代表每个方法执行完毕之后返回对象
Object obj=null;
if(method.getName().equalsIgnoreCase("start")){
System.out.println("检查天气是否良好");
//打印args中的内容
System.out.println(Arrays.toString(args));
obj=method.invoke(new GoogleCar(), args);
System.out.println("检查路况是否拥堵");
}else{
obj=method.invoke(new GoogleCar(), args);
}
return obj;
}
});
String cc=car.start(1,4);
System.out.println(cc);
car.run();
car.stop();
}
}
我想你看完已经略有所思了,但是又好像奇奇怪怪的,但是我能帮你的也只能到这里了。