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

    静态代理不是技术是一种思想,具体大意如下:

      委托方(需要代理的一方)有业务提供,而为了解耦委托方不直接向客户提供业务,而是将业务交给代理方去代理提供,这时客户可直接向代理方请求业务请求,再由代理方去请求委托方处理业务,以此达到处理业务的目的。

    优点:

      委托方:只负责单纯的具体业务,不再关注公共业务,公共业务则交给代理方去处理,以此降低耦合性。

      代理方:只依赖于委托方,将具体业务交给委托方,自己则处理公共业务,所谓公共业务就是即使不同的具体业务也会有公共的业务,虽然他们的具体业务不同,但是公共业务确实相同的,所以代理方只负责处理公共业务,而具体业务则交给委托方去处理即可。

    下面用java代码模拟一段租房的业务来描述静态代理:

    1.委托方和代理方都要实现的一个接口(也可以是抽象类),该接口描述他们都可以做的事情:

    package mr.li.inface;
    
    public interface Host {
    
        /** 房屋出租  */
        void houseRental();
    }

    2.代理类:

    package mr.li.proxy;
    
    import mr.li.host.Landlord;
    import mr.li.inface.Host;
    
    /**
     * 代理类:中介公司
     * @author yanLong.Li
     * @date 2019年3月14日 下午3:35:11
     */
    public class IntermediaryCompany implements Host{
    
        private Landlord landlord;
        
        @Override
        public void houseRental() {
            System.out.println("代理方(公共业务):让客户挑选");
            landlord.houseRental();
            System.out.println("代理方(公共业务):交易完成");
        }
        
        public IntermediaryCompany(Landlord landlord) {
            this.landlord = landlord;
        }
    }

    3.委托类:

    package mr.li.host;
    
    import mr.li.inface.Host;
    /**
     * 委托类:房东
     * @author yanLong.Li
     * @date 2019年3月14日 下午5:05:14
     */
    public class Landlord implements Host{
    
        @Override
        public void houseRental() {
            System.out.println("委托方(具体业务):出租一号大院,出租二号大院");
        }
    
        
    }

    4.获得代理类的工厂类:

    package mr.li.factory;
    
    import mr.li.host.Landlord;
    import mr.li.inface.Host;
    import mr.li.proxy.IntermediaryCompany;
    
    /**
     * 静态工厂类
     * @author yanLong.Li
     * @date 2019年3月14日 下午5:03:36
     */
    public class IntermediaryFactory {
    
        public static Host getInstance() {
            return new IntermediaryCompany(new Landlord());
        }
    }

    5,客户端:

    package mr.li.test;
    
    import mr.li.factory.IntermediaryFactory;
    import mr.li.inface.Host;
    /**
     * 客户
     * @author yanLong.Li
     * @date 2019年3月14日 下午5:09:03
     */
    public class Client {
        
        public static void main(String[] args) {
            System.out.println("客户(客户请求业务):我要租房子");
            Host host = IntermediaryFactory.getInstance();
            host.houseRental();
        }
    }

    打印结果:

    客户(客户请求业务):我要租房子
    代理方(公共业务):让客户挑选
    委托方(具体业务):出租一号大院,出租二号大院
    代理方(公共业务):交易完成

    静态代理的缺点:

      因为静态代理的委托方和代理方都是提前写好的,所以严格意义(原子性)上来讲,我们已经将他定义为具体的业务类型了,如果需要代理其他类型的,就要重新写一套:委托类,代理类,....等。这样就会有很多的代理类出现。

      例如:

        场景一:租房代理,房东(委托类)找中介(代理类)代理出租房屋,我(客户)找中介租房。

        场景二:买零食:食品工厂(委托类)找购物商场(代理类)代理出售零食,我(客户)找商场购买零食。

        ......

      *以上两个场景中中介购物商场扮演的都是代理的角色,两个委托方和客户都有不同的具体实现,所以静态代理也会不相同,这样就会造成租房是一套体系,购物是一套体系,代理类会随着客户和委托方的增加而增加。

      解决方案:虽让以上两套(代码只提供了租房场景,购物场景纯文字描述,原谅我不想写那么多)静态代理方案,但他们的代理公共业务确是相同的(不要扣细节,意思能理解就好),都是 挑选商品,再交易。这种业务就可以使用动态代理下篇我们探讨动态代理。

  • 相关阅读:
    初学Git——命令总结
    CentOS上安装Git及配置远程仓库
    scrapy学习笔记(二)框架结构工作原理
    Scrapy框架的基本组成及功能使用
    网站整站爬取
    使用nginx配置二级域名
    ajaxupload.js调用始终进入error回调
    C scanf 函数的其他使用注意点
    Spring (一 ) 概述与介绍
    MyBatis(三)动态SQL与缓存
  • 原文地址:https://www.cnblogs.com/li-yan-long/p/10540794.html
Copyright © 2011-2022 走看看