码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理

时间:2018-10-19 02:03:03      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:private   override   参数   throwable   main   ticket   ble   public   方法   

代理

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

静态代理

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

动态代理

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

// 一件事,(销售机票)
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();
        
    }
}

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

动态代理

标签:private   override   参数   throwable   main   ticket   ble   public   方法   

原文地址:https://www.cnblogs.com/freebird92/p/9813808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!