动态代理

Posted freebird92

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理相关的知识,希望对你有一定的参考价值。

代理

代理,就是对接,就是对接口。
例:航空公司卖机票。机票代售点,就可以帮它卖。
以就是客户与航空公司直接打交道,直接对接;有了代售点后,客户与代售点进行直接对接, 客户与航空公司售票部就是间接的了。
代理起到的作用是对接, 不是替换。代售点卖的是航空公司的票,不是自己发行的票。

静态代理

它是一个代理,但这个代理只会对接一种事。这就是静态,所谓静态,就是一成不变。例:航空公司卖机票。机票代售点,就可以帮它对接卖机票。

动态代理

它就一个代理,但这个代理会对接各种各样的事。这就是动态,所谓动态,就是会变,会成不同的事。掮客是指替人介绍买卖,对接买卖。例:换上西装卖保险,穿上围裙卖猪肉,戴上眼镜卖机票。还可以做其它代理工作

// 一件事,(销售机票)
public interface Interface {
     void SellTicket(){
     }
}
// 原本需要航空公司销售
public AirCompanySell Implement Interface{
    @override
    void SellTicket(){
        System.out.println("Air company sells tickets!");
    }
}
// 代售点销售 <静态代理>
public TicketAgent Implement Interface{
    private Interface proxied;
    public TicketAgent(Interface sell){
        this.proxied = sell;
    }
    
    @override
    void SellTicket(){
       this.proxied.SellTicket();
        System.out.println("Proxy sells ticks!");
    }
}

// 掮客
public class MidMan implements InvocationHandler{ // 实现干事接口
    private Object proxied;  // 被 代理对象
   // 穿、戴变成相应代理身份
    public Object GetInstance(Object obj){
        this.proxied = obj;
        Class clazz = obj.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);  // 穿了外衣的掮客对象
    }
    
        @Override
    public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        System.out.println("做事开始了..");
        //第一个参数是proxied,也就是被代理类的对象;第二个参数是方法中的参数
        method.invoke(proxied, args);
        System.out.println("做事完了..");
        return null;
    }
}

// 驾驶
public interface IDrive{
     public void Drive() {
     }
}

// 开车回家
public DriveHome implement IDrive{
    @override
    public void Drive(){
        System.out.println("drive to home");
    }
}
// 
public class Test{
    public static void main(String[] args){
        Sell sell = new TicketAgent(new AirCompanySell());
        sell.SellTicket();
        
        // 动态代理
        sell = (Sell) new MidMan().getInstance(new AirCompanySell()); 
        sell.SellTicket();
        
        // 动态代理 
        IDrive driver = (IDrive)new MidMan().GetInstance(new DriveHome());
        driver.Drive();
        
    }
}

这样动态代理, 就是完全对接了任何对象的事,事前事后,还能加点料。

以上是关于动态代理的主要内容,如果未能解决你的问题,请参考以下文章

动态 Rstudio 代码片段

是否可以动态编译和执行 C# 代码片段?

支持动态或静态片段的不同屏幕尺寸?

Forge Viewer - 如何在场景中访问(或获取渲染/片段代理)克隆的网格?

在ansible模板中使用动态组名称

代理模式(动态)