zoukankan      html  css  js  c++  java
  • 动态代理

    代理

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

    静态代理

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

    动态代理

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

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

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

  • 相关阅读:
    Redis简介 安装 注册服务
    Supervisor Linux守护进程
    .Net5 控制台 读取配置文件+依赖注入
    Linux Gdip
    Net Core封装 踩坑
    Apollo 公共Namespace使用json
    Visual Studio 2019修改项目名
    【面向对象】--静态类与非静态类的区别
    win10设置默认中英文符号【程序员标配】
    MySQL 数据库访问驱动-版本问题
  • 原文地址:https://www.cnblogs.com/freebird92/p/9813808.html
Copyright © 2011-2022 走看看