本文编写于 125 天前,最后修改于 125 天前,其中某些信息可能已经过时。

AOP本质:代理模式

……怎么说呢,23种常用设计模式我还没看。先聊聊

(这里应该有张图片,懒得插入了)

你原来可以直接去官网下载软件,但是现在可以从应用商店下载软件,而这个应用商店就是代理。

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,我们一般会做一些附属操作
  • 客户:访问代理角色的人

首先我们看一下没有代理是什么样子的。

先要做的事情是下软件,我们来写一个下软件的接口。

public interface Download {
    void download();
}

这个接口肯定是软件公司调用,因为他们提供了下软件的服务。

public class SC implements Download{
    @Override
    public void download() {
        System.out.println("下软件啦");
    }
}

这时候我们要去下软件,就直接从软件公司的网站下载。

public class Customer {
    public static void main(String[] args) {
        SC sc = new SC();
        sc.download();
    }
}

我们来看一下加了App Store会怎样

我们的App Store先找了软件公司收录了软件。

public class AppStore implements Download{
    private SC sc;

    public AppStore() {
    }

    public AppStore(SC sc) {
        this.sc = sc;
    }

    @Override
    public void download() {
        sc.download();
    }
}

我们从App Store里下载

public class Customer {
    public static void main(String[] args) {
        SC sc = new SC();
        AppStore appStore = new AppStore(sc);
        appStore.download();
    }
}

这时候软件公司不再免费提供,则只需对App Store说一声就行了。

public class AppStore implements Download{
    private SC sc;

    public AppStore() {
    }

    public AppStore(SC sc) {
        this.sc = sc;
    }

    @Override
    public void download() {
        pay();
        sc.download();
    }
    public void pay(){
        System.out.println("软件收费18元");
    }
}

静态代理模式的好处:

  • 可以使真实角色的操作更加纯粹!不去关注公共业务
  • 实现了业务的分工
  • 发生拓展容易集中管理

缺点

  • 一个真实角色会产生一个代理角色:代码量翻倍,开发效率低下

动态代理的前置只是是需要了解反射机制

而我还没看所以就直接写部分代码,以后看完反射来补全这个部分

通用的自动生成代理

//自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }
    //生成得到的代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    //处理代理实栗,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(target, args);
        return result;
    }
}
public class Customer {
    public static void main(String[] args) {
        //真实角色
        SC sc = new SC();
        //代理角色,不存在
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setTarget(sc);//设置要代理的对象
        //动态生成代理类
        Download proxy = (Download) pih.getProxy();
        proxy.download();
    }
}

动态代理的好处有:

  • 可以使真实角色的操作更加纯粹!不去关注公共业务
  • 实现了业务的分工
  • 发生拓展容易集中管理
  • 一个动态代理类代理一个接口,一般就是对应一类业务
  • 一个动态代理类可以代理多个类,只是实现了同一接口即可。