文章目录
代理模式简介
在Java23中设计模式中,代理模式在开发中是比较常见的,所谓的代理模式思想,个人理解为委托类(被代理类),不愿意被调用者直接去调用或者由于其他特殊原因不能被调用者直接调用,从而委托代理类去负责与外界交互,然后代理类再调用委托类去做相关操作
通俗的举个生活中例子:明星和经纪人
比如现在
王宝宝
是个电影明星,王宝宝
不可能直接去和电影公司去商量去接那部电影,拿多少片酬,这个时候就需要经济人宋宝宝
代表王宝宝
去个公司谈拿多少片酬,接那部戏。这样避免明星王宝宝
过多的解除外界能够专心的演戏。
1、静态代理模式
1.1、新建接口
public interface Iplay {
/**
* 演戏
*/
void palyActing();
}
1.2 、创建演员类王宝宝实现Iplay 接口
public class WangBaoBao implements Iplay {
@Override
public void palyActing(String name) {
Log.e("TAG","开始出演"+name+"电视剧");
}
}
1.3 、创建经纪人宋宝宝代理类
public class SongBaoBao implements Iplay {
/**
* 委托类对象 ,王宝宝
*/
private WangBaoBao wangBaoBao;
/**
* 获取王宝宝的委托对象
*
* @return
*/
public WangBaoBao getWangBaoBao() {
if (wangBaoBao != null) {
wangBaoBao = new WangBaoBao();
}
return wangBaoBao;
}
@Override
public void palyActing(String name) {
/**
* 经济人可以给明星安排出演那些活动
*/
if(!"跑男".equals(name)) {
wangBaoBao.palyActing(name);
}
}
}
1.4 、电影公司邀请王宝宝去拍电影,的通过宋宝宝这个经济人去做中间协调,这样王宝宝就不用操心那些活动出席那些不出席
public class Test {
public static void main(String args[]){
SongBaoBao songBaoBao=new SongBaoBao();
songBaoBao.palyActing("人鬼情未了");
}
}
以上整个过程的设计思想,被称之为代理模式,以上代理模式,又称之为代理设计模式中静态代理,那什么是动态代理呢?所谓的动态代理就是代理对象通过动态创建的方式去创建
这样又什么好处呢? 通过上边静态代理的例子,如果我们在Iplay 接口加了大量的方法,那我们的代理对象是不是也的重写相应的方法,这样不利于扩展。
2、动态代理模式
动态代理,利用反射技术动态创建代理对象
2.1 、创建接口
public interface IplayGame {
void palyGame();
}
2.2 、创建委托类
public class RealObject implements IplayGame {
@Override
public void palyGame() {
Log.e("TAG", "palyGame============");
}
}
2.3 、创建动态创建代理对象类
public class DynamicProxy implements InvocationHandler {
IplayGame iplayGame;
public DynamicProxy(IplayGame iplayGame) {
this.iplayGame = iplayGame;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* 通过反射返回一个代理对象
*/
Object invoke = method.invoke(iplayGame, args);
return invoke;
}
}
2.4 、生成代理对象,并调用相关方法
// 创建真实对象
RealObject realObject=new RealObject();
// 动态代理对象实例化
DynamicProxy dynamicProxy=new DynamicProxy(realObject);
// 系统提供方法,根据动态代理对象和真实类,创建代理对象
IplayGame o = (IplayGame) Proxy.newProxyInstance(realObject.getClass().getClassLoader(), new Class[]{IplayGame.class}, dynamicProxy);
o.palyGame();