设计模式之代理模式

代理模式简介

在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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值