代理设计模式上篇(主讲静态代理)

138 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

代理设计模式

首先要明确一点:你为什么要做代理?不就是想找专业的人帮你做事嘛。
在我看来,代理的核心功能就是方法增强。

1. 静态代理模式

方法增强有两种,一种是类继承,另一种是实现共同一个接口(这一点有点蒙,继续往下看)。

继承类实现方法增强

首先定一个接口,就用歌手唱歌来举例。下面定义了一个歌手接口。

public interface Singer {
    void sing();
}

现在有一个男歌手,男歌手会唱歌对不对,歌手嘛~
我们让这个男歌手掌握唱歌的技能,就是实现了歌手这个接口。

public class ManSinger implements Singer{
    //歌手需要一个名字
    private String name;
    //构造器给他名字
    public ManSinger(String name) {
        this.name = name;
    }

    @Override
    public void sing() {
        System.out.println("开始唱歌了!");
    }
}

现在那有个活动策划人来找他,希望这个男歌手可以唱个歌开个演唱会。那歌手懵了啊,我就会唱歌,开演唱会这个工作我不会啊,那怎么办?
那他只能找个人帮他谈好场地,弄好开演唱会的除了唱的所有事情了,这个人就是他的经纪人呀。我们需要这个经济人去包装一下这个歌手,下面看代码实现。

public class Agent extends ManSinger {

    private ManSinger manSinger;

    public void setManSinger(ManSinger manSinger) {
        this.manSinger = manSinger;
    }

    @Override
    public void sing() {
        System.out.println("节目组找过来!需要演出,谈好演出费用。。。。。");
        manSinger.sing();
        System.out.println("结算费用,下一次合作预约。。。。。。");
    }
}

那这样歌手就可以安安心心的去唱歌了。

public class Client {
    public static void main(String[] args) {
        ManSinger manSinger = new ManSinger("鹿晗");
        Agent agent = new Agent();
        agent.setManSinger(manSinger);
        agent.sing();
    }
}

实现接口实现方法增强

第二中方法就是我们不让这个代理去继承男歌手这个类了,直接让他去实现歌手这个接口,来达到方法增强的目的。

public class Agent implements Singer{
    private Singer singer;

    public Agent(Singer singer) {
        this.singer = singer;
    }

    @Override
    public void sing() {
        System.out.println("节目组找过来!需要演出,谈好演出费用。。。。。");
        singer.sing();
        System.out.println("结算费用,下一次合作预约。。。。。。");
    }
}

歌手依然可以好好唱歌了。

public class Client {
    public static void main(String[] args) {
        ManSinger singer = new ManSinger("鹿晗");
        Singer agent = new Agent(singer);
        agent.sing();
    }
}

优点

  • 男歌手还是男歌手,没有必要为了一下前置后置工作改变男歌手这个类
  • 公共的统一问题交给代理处理
  • 公共业务进行扩展或变更时,可以更加方便
  • 这不就是更加符合开闭原则,单一原则吗?

缺点

  • 缺点就是每个类都要写个代理,太麻烦了。

以上就是静态代理的所有内容了。

动态代理

什么是动态代理?

  • 动态代理的角色和静态代理的一样
  • 动态代理的代理类是动态生成的 ,静态代理的代理类是我们写的
  • 动态代理分为两类 : 一类是基于接口动态代理 , 一类是基于类的动态代理
    • 基于接口的动态代理----JDK动态代理
    • 基于类的动态代理--cglib

动态代理就是当有大量的类需要执行一些共同代码时,我们自己写太麻烦,那能不能直接使用java代码,自动生成一个类帮助我们批量的增强某些方法。

下篇还未更新,将持续更新下篇动态代理,请大家持续关注......