本文已参与「新人创作礼」活动,一起开启掘金创作之路。
代理设计模式
首先要明确一点:你为什么要做代理?不就是想找专业的人帮你做事嘛。
在我看来,代理的核心功能就是方法增强。
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代码,自动生成一个类帮助我们批量的增强某些方法。
下篇还未更新,将持续更新下篇动态代理,请大家持续关注......