接地气之动态代理(全网最易懂!!!)

动态代理

原类

//对象事情太多,且耦合性高   当需要对唱歌类增加氛围组(新需求或功能)时,需要在源码修改 
class 明星A(){   
	 唱歌(){
        //准备演唱会
        //唱歌
    }    
}

代理

被代理类

//为什么明星也要实现这个接口-->当明星要更改需求,接口方法要改变,代理方法随着接口改变而改变  (java生产代理的约定)
class 明星() implements 需求{
    private String name;  // 暂且为明星A
    public BigStar(String name) {
        this.name = name;
    }
    public String sing(String singname){//先写为成员方法理解,后面继承接口之后 ALT+回车 (实际为需求接口的实现)
        System.out.println(this.name+"正在唱"+singname); //只需要写自己要做的事情
        return "谢谢";
    }
}

中介

产生代理的工具类

//明星A找什么样的经纪人-->需要告诉中介公司 然后中介公司 找到合适的经纪人-->找会唱歌,跳舞的--> 接口(明星给中介的需求)
class 中介(){  //产生代理的工具类
 	public static "需求" createProxy(明星 明星A){//返回类型为 需求类  (返回含有这个需求的代理) 
        
       //newProxyInstance()返回类型为 Object-->强转 
     Star starproxy=(Star)proxy.newProxyInstance(类加载器,.new Class[]{ 接口.Class },new InvocationHandler(){
         
      //本方法相当于经纪人要做的事情
       @Override   // Method->经纪人需要做的事情   arg->告诉明星需要唱什么歌  (被代理类方法传入的参数)
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           
         	  //判断经纪人需要做的事情    (判断为传入的方法,书写代理的代码)
			 if(method.getName().equals("sing")){
                   准备演唱会,收钱         //代理的事情
                }
               return method.invoke(明星A,args);  //告诉明星需要做的事情 (运行被代理类)
       });
 	}
}

需求

 interface 需求(){
        唱歌(String singname);
 }

实现结果

public class Main {
    public static void main(String[] args) {
        BigStar bigStar=new BigStar("明星A");
        Star star=ProxyUtil.createProxy(bigStar);
        String sing = star.sing("月亮之上");
        System.out.println(sing);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值