• 大话设计模式:静态代理模式


    代理模式分为静态代理和动态代理,本篇先介绍一下静态代理。将“静态代理”拆成“静态”和“代理”,什么是代理?其实我们生活中处处都存在代理。

    事例一:比如去超市买东西,超市其实就是一个代理点,因此超市还叫代售点,因为超市本身不会生产东西,真正生产东西的是厂商,而我们消费者是不会直接去厂商买东西,而是通过超市这个中间层,间接买超市的东西。

    事例二:律师,其实就是一个代理,就像我们平民大众,虽说知道法律,但不懂法律,遇到纠纷在法院打官司的时候,就需要请律师,律师的作用就是对平民的增强,他来代替我们打官司。

    事例三:海外代购,像我们一般人,没机会或者没钱出国购物,怎么办?只能通过代购渠道来购买国外的产品,代购商会替我们在国外找到优质真品(当然你懂的)从国外买,然后寄回我们的手中,这就实现了我们自身的增强。

    代理作为中间层,连通了我们和厂商之间,所以反映到Java中:

    1. 代理类和厂商都需要实现同一个接口,目的是都具备了同一种功能。

    2. 代理类还需要将厂商作为自己的属性,目的是为了让自己有从厂商那里购买东西的资格。

    3. 通过创建代理类的对象来对目标方法的增强。

    举例:

    1. 创建共同的接口

    /**
     * description
     *
     * @author 70KG
     * @date 2018/8/1
     */
    public interface IBusinessA {
    
        /**
         * Description: 卖包的业务接口
         * Author:70KG
         * Param [brand] 品牌
         * Return void
         * Date 2018/8/1 9:46
         */
        void saleBag(String brand);
    
    }

    2. 创建厂商(需要实现业务接口)

    /**
     * description
     *
     * @author 70KG
     * @date 2018/8/1
     */
    public class CompanyA implements IBusinessA {
    
        @Override
        public void saleBag(String brand) {
            System.out.println("从国外A公司买到一款" + brand + "牌的包。");
        }
        
    }

    3. 创建代理商(需要实现业务接口)

    /**
     * description
     *
     * @author 70KG
     * @date 2018/8/1
     */
    public class ProxyClassBean implements IBusinessA {
    
        private CompanyA companyA;
    
        @Override
        public void saleBag(String brand) {
            // 购买前增强
            doBefore();
            // 通过国外公司代购产品
            companyA.saleBag(brand);
            // 购买后增强
            doAfter();
        }
    
        public CompanyA getCompanyA() {
            return companyA;
        }
    
        public void setCompanyA(CompanyA companyA) {
            this.companyA = companyA;
        }
    
        // ===================代理类中的增强方法========================
    
        public void doBefore() {
            System.out.println("在国外寻找优质的货源。");
        }
    
        public void doAfter() {
            System.out.println("精包装安全邮寄回国内。");
        }
    }

    4. 通过创建代理类来实现对目标方法的增强

    /**
     * description
     *
     * @author 70KG
     * @date 2018/8/1
     */
    public class MainTest {
    
        @Test
        public void test() {
            // 创建代理类的对象
            ProxyClassBean proxyClassBean = new ProxyClassBean();
            CompanyA companyA = new CompanyA();
            proxyClassBean.setCompanyA(companyA);
            // 执行代理类的方法来对目标方法增强
            proxyClassBean.saleBag("Gucci");
        }
    
    }

    5. 运行的结果

    在国外寻找优质的货源。
    从国外A公司买到一款Gucci牌的包。
    精包装安全邮寄回国内。

    静态代理的优点:能人所不能,会人所不会。对目标方法的增强。

    静态代理的缺点:扩展性不好,假如业务扩展,需要实现的接口会很多,假如接口参数变动,所有的类都需要改变,扩展性很差。

    改进:使用动态代理模式(dynamic proxy)

  • 相关阅读:
    ●BZOJ 3894 文理分科
    ●BZOJ 1797 [Ahoi2009]Mincut 最小割
    ●BZOJ 1934 [Shoi2007]Vote 善意的投票
    ●BZOJ 3996 [TJOI2015]线性代数
    php--->self与static区别
    php--->使用callable强制指定回调类型
    php--->依赖注入(DI)实现控制反转(IOC)
    php--->cookie和session
    php--->注册模式
    linux---> siege压力测试工具使用
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/9400249.html
Copyright © 2020-2023  润新知