代理模式
2019-01-16 本文已影响0人
杨殿生
代理代理,就是找个人代替你做你该做的事,分为静态代理和动态代理,一个一个说
准备工作
我们先假设一种场景,打游戏,我们创建一个游戏人物去打游戏,让一个代理帮我们打游戏
1,建立一个游戏人物的抽象类
public interface GamePlayer {
void login(String user,String password);
void killBoss();
void upgrade();
}
2,游戏人物的实体类
public class GamePlayerA implements GamePlayer{
private String name;
public GamePlayerA(String name){
this.name = name;
}
@Override
public void login(String user, String password) {
System.out.println(name + " 登录成功" + " 登录名为" + user);
}
@Override
public void killBoss() {
System.out.println(this.name + "在打怪");
}
@Override
public void upgrade() {
System.out.println(this.name + "恭喜你 升级了");
}
}
下面开始实现代理
静态代理
静态代理是在编译时期就把代理实现了
1,将被代理对象构造注入,代码如下
public class GamePlayerProxy implements GamePlayer{
private GamePlayer gamePlayer;
public GamePlayerProxy(GamePlayer gamePlayer){
this.gamePlayer = gamePlayer;
}
@Override
public void login(String user, String password) {
this.gamePlayer.login(user,password);
}
@Override
public void killBoss() {
this.gamePlayer.killBoss();
}
@Override
public void upgrade() {
this.gamePlayer.upgrade();
}
}
2,调用
public class Main {
public static void main(String[] args){
GamePlayer gamePlayer = new GamePlayerA("张三");
GamePlayerProxy gamePlayerProxy = new GamePlayerProxy(gamePlayer);
gamePlayerProxy.login("zhangsan","password");
gamePlayerProxy.killBoss();
gamePlayerProxy.upgrade();
}
}
还是挺简单的,就是把被代理对象构造注入,然后在内部调用被代理对象,这里我们可以做的更极致一点就是把被代理对象都隐藏起来让高层组件只能接触到代理对象
动态代理
在运行时创建代理类,这里要注意我们使用java中的动态代理实际上就是创建了在运行时动态创建了一个
public class Main {
public static void main(String[] args){
GamePlayer gamePlayer = new GamePlayerA("张三");
GamePlayer gamePlayerProxy = (GamePlayer) Proxy.newProxyInstance(gamePlayer.getClass().getClassLoader(),
gamePlayer.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(gamePlayer,args);
}
});
gamePlayerProxy.login("zhangsan","password");
gamePlayerProxy.killBoss();
gamePlayerProxy.upgrade();
}
}
我们在使用的时候大部分都是使用的动态代理,通过反射调用目标方法,在代理中增加非业务性代码,比如打点啊,数据统计之类的