吃透动态代理,解密spring AOP源码(一)

代理模式:

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
目的:1.通过引入代理对象来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;2.通过代理对象对原有的业务增强。

如图代理模式类图:

简单看了下图解就开始上代码吧
1.先定义一个抽象对象即公共接口类

/**
 * 负责生产男性用品
 */
public interface ManToolFactory {  
    public void saleManTool(String size);
}

2.真实对象

/**
 * A工厂负责生产男性用品
 */
  public class AManFactory implements ManToolFactory {

    @Override
    public void saleManTool(String size) {
        System.out.println("A工厂出售男性用品,大小为" + size );
    }

}

3.代理对象

 /**
 * 静态代理类
 */
public class StaticProxy implements ManToolFactory {

    // 代理的真实对象,多个的话考虑公用object也就是动态代理的实现
    private ManToolFactory manFactory;// 类似搬运工,代理真实对象的方法

    public StaticProxy(ManToolFactory manFactory) {
        this.manFactory= manFactory;
    }

    @Override
    public void saleManTool(String size) {
        dosomeThingBefore();//前置增强
        manFactory.saleManTool(size);
        dosomeThingAfter();//后置增强
    }

    public void dosomeThingBefore() {
        System.out.println("售前服务,负责产品的调研工作");
    }

    public void dosomeThingAfter() {
        System.out.println("售后服务,送门服务,三包等");
    }
}

测试类:

 public class StaticProxyTest {

    public static void main(String[] args) {
        // 真实对象:A工厂生产男性用品
        ManToolFactory manToolFactory = new AManFactory();
        // 代理对象:负责代购男性用品
        StaticProxy staticProxy = new StaticProxy(manToolFactory);
        // 代理对象完成代购
        staticProxy.saleManTool("100");
    }
}

由代理模式可增强原有业务。 问题来了,如今代理不仅仅帮忙代购男性用品,也要代购女性用品,那同样的我们就再定义一个接口。

/**
 * 负责生产女性用品的抽象对象
 */
public interface WomanToolFactory {

    public void saleWomanTool(Double length);
}
/**
 * B工厂专门负责生产男性用品(真实对象)
 */
public class BWomanFactory implements WomanToolFactory {

    @Override
    public void saleWomanTool(Double length) {
        System.out.println("B工厂生产女性用品,长度" + length);
    }

}
此时代理类需要修改,开始思路如下


public class StaticProxy implements ManToolFactory,WomanToolFactory  {

    private ManToolFactory manFactory;
    private WomanToolFactory womanFactory;
     @Override
    public void saleManTool(String size) {
      //TODO
    }
     @Override
    public void saleWomanTool(Double length) {
      //TODO
    }

 

那如果再多一个业务,代购点别的产品,那是不是又要再实现一个接口,这样就违背了设计模式的原则:开闭原则,扩展能力差,可维护性差.
因此动态代理就出现了。动态代理请看下节

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值