您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
12_动态代理1_基本实现步骤(动态代理设计模式)
发布时间:2022-09-28 23:17:28编辑:雪饮阅读()
需求其实很简单。
假如我想买联想电脑,但联想电脑在北方,去北京太麻烦。
于是乎,我发现西安有联想电脑的代理商,于是乎我去西安的联想代理商那边去买联想电脑了。
动态代理设计模式,何为动态?就是被代理对象原本我是不被代理前比如我“西安.卖电脑()”这种方法的执行,其中“西安”是固定的,那如果我还有一个“南京.卖电脑()”方法。。。等等以此类推。
所以我们需要有动态的对象去执行对应的动态方法。
下面的实例中,实现了代理对象的执行,但是暂还未实现动态对象的对应动态方法的调用。
买或卖电脑的接口
package package3;
//卖电脑接口
public interface SaleComputer {
public String sale(double money);
public void show();
}
卖电脑的实体类
package package3;
//联想电脑实现卖电脑接口,假设北京为联想总部,代理联想的为联想的西安代理商
public class Lenovo implements SaleComputer {
@Override
public String sale(double money) {
System.out.println("花了"+money+"元买(卖)了一台联想电脑");
return "联想电脑";
}
@Override
public void show() {
System.out.println("展示电脑。。。。");
}
}
代理卖电脑:
package package3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args){
Lenovo lenovo=new Lenovo();
//动态增强对象
//参数1 类加载器:真实对象.getClass().getClassLoader()
//参数2 接口数组:真实对象.lenovo.getClass().getInterfaces()
//参数3 处理器 new InvocationHandler()
SaleComputer proxy_lenovo=(SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
//invoke 代理编写的方法,代理对象(注意这里是代理对象,不是真实对象)调用的所有方法都会触发该方法执行
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke被执行");
System.out.println("method.getName:"+method.getName());
System.out.println("args[0]:"+args[0]);
return null;
}
});
//不使用联想电脑自己的卖电脑方法,而是通过代理来卖电脑(假定proxy_lenovo为联想的西安代理商)
proxy_lenovo.sale(8000);
//这里实际代理对象执行了方法后我个人理解是要在invoke里面绩去动态执行对应的被代理的真实对象的对应方法了。
//这样是直接执行:lenovo.sale(8000);代理方式执行需要在invoke里面动态的对象去执行了(个人理解)。
}
}
关键字词:动态代理1,基本实现步骤,动态代理设计模式
相关文章
-
无相关信息