Java代理

作者: lxqljc | 来源:发表于2020-05-06 16:28 被阅读0次
    一、代理知识点
    image.png
    二、什么是代理

    简单的说,代理就是中介。举个例子,你要买房子,涉及的的角色有,中介(代理对象)、业主(真实对象)、卖房子(抽象角色行为)。

    三、静态代理实现

    1.抽象角色行为

    package proxy;
    
    /**
     * 抽象角色-行为(代理对象和真实对象需要实现的行为)
     */
    public interface Sell {
    
        void sell();
    }
    
    

    2.真实对象(实际业务)

    package proxy;
    
    public class Owner implements Sell {
    
        @Override
        public void sell() {
            System.out.println("业主卖房子");
        }
    }
    

    3.代理对象(持有抽象角色完成实际业务,可以扩展)

    package proxy;
    
    public class Agent implements Sell {
    
    
        private Sell seller;
    
        public Agent(Sell seller) {
            this.seller = seller;
        }
    
        @Override
        public void sell() {
    
            before();
            seller.sell();
            after();
        }
    
        /**
         * 操作之前
         */
        private void before(){
            System.out.println("付给中介部分服务费");
        }
    
        /**
         * 操作之后
         */
        private void after(){
            System.out.println("付给中介所有服务费");
        }
    }
    

    4.操作实现

     public static void main(String[] args) {
            Owner owner = new Owner();
            Agent agent = new Agent(owner);
            agent.sell();
        }
    
    四、动态代理实现

    假设现在中介代理多一个相亲业务。
    1.增加一个抽象业务

    /**
     * 相亲介绍
     */
    public interface Matchmaker {
    
        void introduce();
    }
    

    2.相亲公司实现业务

    package proxy;
    
    /**
     * 婚庆公司
     */
    public class MarriageCompany implements Matchmaker {
    
        @Override
        public void introduce() {
            System.out.println("介绍美女给你");
        }
    }
    
    
    

    3.动态代理根据情况实现卖房子还是相亲介绍

    package proxy;
    
    import java.lang.reflect.Proxy;
    
    public class Test {
    
        private static Owner sell;
        private static MarriageCompany company;
        public static void main(String[] args) {
    
            //动态代理
            //卖房子
            sell = new Owner();
            //相亲
            company = new MarriageCompany();
            
            //type 1= 卖房子  2=相亲
            Object o = proxyBusiness(1);
            Sell sell = (Sell) o;
            sell.sell();
    
            Object o2 = proxyBusiness(2);
            Matchmaker matchmaker = (Matchmaker) o2;
            matchmaker.introduce();
        }
    
        /**
         * 代理实际业务
         */
        public static Object proxyBusiness(int type){
    
           return Proxy.newProxyInstance(Test.class.getClassLoader(), new Class[]{Sell.class, Matchmaker.class},
                    (proxy, method, args) -> {
                        Object object = type == 1 ? sell : company;
                        return method.invoke(object,args);
                    });
        }
    }
    
    
    五、静态代理和动态代理的优缺点

    1.静态代理
    一般一个代理对象代理一个抽象业务,如果有多个抽象业务,需要定义多个代理类。
    2.动态代理
    可以根据实际的抽象业务,动态生成代理到内存中。

    相关文章

      网友评论

        本文标题:Java代理

        本文链接:https://www.haomeiwen.com/subject/ynhwghtx.html