zoukankan      html  css  js  c++  java
  • 大话设计模式:静态代理模式

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

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

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

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

    代理作为中间层,连通了我们和厂商之间,所以反映到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)

  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/9400249.html
Copyright © 2011-2022 走看看