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

/ 大话设计模式 / 0 条评论 / 400人围观

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

事例一:

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

事例二:

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

事例三:

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

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

}
  1. 创建厂商(需要实现业务接口)
/**
 * description
 *
 * @author 70KG
 * @date 2018/8/1
 */
public class CompanyA implements IBusinessA {

    @Override
    public void saleBag(String brand) {
        System.out.println("从国外A公司买到一款" + brand + "牌的包。");
    }
    
}
  1. 创建代理商(需要实现业务接口)
/**
 * 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("精包装安全邮寄回国内。");
    }
}
  1. 通过创建代理类来实现对目标方法的增强
/**
 * 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");
    }

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

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

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

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