注:每条线的定义如图![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/abb422f62acd9d05fbc2d59fb9ac3760.png)
动态代理模式的类图设计
注意:InvocationHandler的接口是JDK提供的一个动态代理类的接口,对被代理类的方法进行代理
public interface IGamePlayer{
//登录游戏
public void login(String user,String password);
//杀怪, 这是网络游戏的主要特色
public void killBoss();
//升级
public void upgrade();
}
public void GamePlayer implements IGamePlayer{
private String name = "";
public GamePlayer(String _name){
this.name = _name;
}
//登录游戏
public void login(String user,String password){
System.out.print(user+"登录了");
};
//杀怪, 这是网络游戏的主要特色
public void killBoss(){
System.out.print("boss被干死了");
};
//升级
public void upgrade(){
System.out.print("升级了");
};
}
}
public void DynamicProxy implements InvocationHandler{
private Object obj;
public DynamicProxy(Object object) {
this.obj = object;
}
//调用被代理的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(this.obj, args);
return result;
}
}
在使用的地方进行调用
public void User{
//被代理的对象
IGamePlayer player = new IGamePlayer("炸锅");
ClassLoader loader = IGamePlayer.getClass().getClassLoader();
InvocationHandler handler = new DynamicProxy(player);
IGamePlayer proxy = (IGamePlayer)Proxy.newProxyInstance(loader,new Class[]{IGamePlayer.calss},handler);
proxy.login("炸锅","222")
}
DynamicProxy的AOP(Aspect oritented programming)的实现范例
public void DynamicProxy implements InvocationHandler{
private Object obj;
public DynamicProxy(Object object) {
this.obj = object;
}
//调用被代理的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(this.obj, args);
//"login 是指自己指定的obj 的方法的一个代表,实际可以是任意的obj的方法"
if(method.getName().equalsIgnoreCase("login"){
// 自己的逻辑
}
return result;
}
}
总结
DynamicProxy 的实质:
- 代理的对象 ****(利用依赖倒置原则和里氏替换原则)
- InvocationHandler的实现类
- Proxy.newProxyInstance(ClassLoader l,new Class<?>[] interfaces,InvocationHandler handler);
动态代理的内部设计后续完成