1.什么代理?
用一个敏感话题来说明一下什么是代理🤪
这边只是做个比喻,祝愿兄弟们早日去到自己心仪的大厂。
1.1 代理的作用
- 功能增强 - 是不是给你包装了一下?相同的我在代理类里面可以做一些逻辑。
- 控制访问 - 大厂是不是菜鸡不让进?外包公司包装一下就可以。
2. 静态代理(装饰者模式)
举个例子说明一下,这边是外包公司给大厂做的代理,注意看,外包公司和大厂都实现了查看你简历和判断你能力的接口,大厂单独判断的话,你是没有胜算的,但是从代理类走一下,你的情况就变好了,这边对的大厂是固定一家,所以是静态代理,如果这边大厂换了,那么我们还需要改代码。所以这边就是静态代理的弊端。
public class MyInfo {
//我的开发经验年数
private int experence;
//是否是公司推荐
private boolean ifRecommand;
public MyInfo() {
}
public MyInfo(int experence, boolean ifRecommand) {
this.experence = experence;
this.ifRecommand = ifRecommand;
}
public int getExperence() {
return experence;
}
public void setExperence(int experence) {
this.experence = experence;
}
public boolean isIfRecommand() {
return ifRecommand;
}
public void setIfRecommand(boolean ifRecommand) {
this.ifRecommand = ifRecommand;
}
}
interface ReadAndChange{
public String readAndCharge(MyInfo myInfo);
}
class BigFactory implements ReadAndChange{
/**
* 大厂查看一下你的简历。并且判断你要不要你
* @return
*/
public String readAndCharge(MyInfo myInfo){
if(myInfo.getExperence()>10||myInfo.isIfRecommand()){
return "恭喜你你被录取了!";
}else{
return "你不太行";
}
}
}
/**
* 外包公司
*/
class OutBagFactory implements ReadAndChange{
BigFactory bigFactory = new BigFactory();
@Override
public String readAndCharge(MyInfo myInfo) {
myInfo.setExperence(myInfo.getExperence()+10);
myInfo.setIfRecommand(true);
return bigFactory.readAndCharge(myInfo);
}
}
public class test {
public static void main(String[] args) {
BigFactory bigFactory = new BigFactory();
/**
* 现在你要像大厂投递简历
* 你只有一年工作经验
*/
MyInfo myInfo = new MyInfo(1,false);
/**
* 自己投递简历,解雇可想而知,肯定是不太行
*/
System.out.println(bigFactory.readAndCharge(myInfo));
/**
* 我找个外包公司让他去帮我投递,结果可想而知是可以的你被录取了
* 那么这边的外包公司就是帮大厂代理了,这边就是静态代理
*/
OutBagFactory outBagFactory = new OutBagFactory();
System.out.println(outBagFactory.readAndCharge(myInfo));
}
}
2.1装饰者模式
上面的实际上还是说的不是很清晰下面就单纯的从代码角度阐述什么是装饰者模式
3.Proxy动态代理
这边概念讲起来很抽象!我直接贴代码讲一下
public class MyHandler implements InvocationHandler {
/**
* 这边动态代理的对象
*/
private Object targets;
public MyHandler(Object targets) {
this.targets = targets;
}
//args是入参
//method 你执行的某个方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//这边是执行方法返回的值
Object result = null;
//这边是你通过代理类对象执行的某个方法
result = method.invoke(targets,args);
System.out.println("你好啊!");
return result;
}
}
上面的方法还是比较麻烦,一图流可以解决的明明白白
4.CGLib 动态代理
这边就不墨迹了,重要的地方我都写了注释,看一下。