设计模式系列《代理模式》
作者:互联网
代理模式
代理模式说白了就是你要做什么,就请个人帮你做。
- 比如你买不到K40,就花贰佰请黄牛帮忙买(麻了,我就亏了贰佰)。
- 你写了点不正经的代码,例如爬了些奇怪的网站,被抓了,请律师帮忙打官司。
- 你有一堆脑残粉,你想赚他的钱,你总不能跟他们要吧,请经纪人/代理人卖周边。
代理模式很容易和修饰器模式弄混,我这里提一嘴:
相同点:
- 二者都能对功能进行增强
- 在静态代理模式下需要传递对象,这里和修饰器模式很类似,但值得注意的一点是装饰器模式的对象从没变过,而静态模式变过。
不同点
- 装饰器模式是在功能外增强,并不会影响你这个类,原本是什么类最后也还是什么类。代理模式使用后,类会改变,不是原本的类了,而是代理的类。
- 装饰器模式仅仅提供功能增强不会增强的类有所牵制。代理模式会对类施加控制, 并不提供对象本身的增强功能,而是使用代理后的对象进行的增强。
需要看代理模式的可以看我的这个文章:装饰器模式
静态代理模式
静态代理模式就是把本体类传进代理类里,让代理类帮我们做增强行为。
- 写一个接口,代表我的职业
public interface Programmer {
// 身为一个程序猿必须会写代码
void coding();
}
-
我叫zsp是一个程序猿
package static_proxy; public class ZSP implements Programmer{ // 我叫zsp,一个程序猿 @Override public void coding() { System.out.println("我叫zsp,一个程序猿,每天都喜欢学新的东西") } }
-
我很喜欢写代码,但是没什么人看,我需要我崇拜的人Java3y来给我点赞博取关注
public class Java3y implements Programmer{ // Java3y是我很崇拜的一个程序猿, // 得到他的点赞会让我很开心 // 也能让更多人认识我 private ZSP zsp; public Java3y(ZSP zsp){ this.zsp=zsp; } public void like(){ System.out.println("Java3y给我点了一个赞"); } @Override public void coding() { zsp.coding(); like(); } }
-
最后,把类装进代理类里,进行代理实现
public class TestStaticProxy {
public static void main(String[] args) {
ZSP zsp = new ZSP();
Programmer java3y = new Java3y(zsp);
java3y.coding();
}
}
透明代理模式
透明代理和静态代理的不同就是不需要传递对象给构造方法了,直接在代理类中生成需要方法增强的对象。
举例:3Y看我写的非常好(自吹的),但是就没人看,于是以后每天都帮我点赞,不帮别人点赞了
- 在静态代理的基础上,对代理类进行修改:
public class Java3y implements Programmer{
private ZSP zsp;
//透明代理就是:3Y看我写的非常好(自吹的),
// 但是就没人看,于是以后每天都帮我点赞,不帮别人点赞了
public Java3y() {
this.zsp = new ZSP();
}
public void like(){
System.out.println("Java3y以后只为我点赞,不帮别人点赞了~");
}
@Override
public void coding() {
zsp.coding();
like();
}
}
- 进行实现:
public class TestStaticProxy {
public static void main(String[] args) {
Programmer java3y = new Java3y();
java3y.coding();
}
}
代理模式自定义方法
就是透明模式的功能增强,加了点功能。
举例:自定义代理就是3Y一直给我点赞,导致看我的人越来越多(并没有),然后3Y就想要向我收费了(也没有);
- 改变的代码只有这里,所以就只贴这个。
package custom_proxy;
public class Java3y implements Programmer {
private ZSP zsp;
//自定义代理就是3Y一直给我点赞,导致看我的人越来越多(并没有)
// 然后3Y就想要向我收费了(也没有)
public Java3y() {
this.zsp = new ZSP();
}
public void like(){
System.out.println("Java3y以后只为我点赞,不帮别人点赞了~");
}
public void getMoney(){
System.out.println("现在点赞要贰佰~");
}
@Override
public void coding() {
zsp.coding();
like();
getMoney();
}
}
动态代理
动态代理运用的是java自带的一个API,即Proxy。
举例:因为3Y要钱(并没有),所以我交不起钱了,只能请水军。
public class Dynamic_Proxy {
public static void main(String[] args) {
ZSP zsp = new ZSP();
Programmer programmerWaterArmy = (Programmer) Proxy.newProxyInstance(zsp.getClass().getClassLoader(), zsp.getClass().getInterfaces(), ((proxy, method, args1) -> {
if (method.getName().equals("coding")) {
method.invoke(zsp, args);
System.out.println("水军,来水评论了");
} else {
return method.invoke(zsp, args);
}
return null;
}));
programmerWaterArmy.coding();
}
}
这个方法需要传入的三个参数分别是:
- 生成代理对象使用的类加载器。
- 生成对象的额接口。
- 生成代理对象方法里要怎么做。
动态代理和静态代理的区别:
- 静态代理需要我们传入代理对象。而动态代理不用,他是自己生成的。
- 使用静态代理时:如果目标对象的接口有很多方法的话,那我们还是得一一实现,这样就会比较麻烦。
- 使用动态代理时:代理对象的生成,是利用JDKAPI,动态地在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型),并且会默认实现接口的所有方法。
代理模式很容易和修饰器模式弄混,我这里提一嘴:
相同点:
- 二者都能对功能进行增强
- 在静态代理模式下需要传递对象,这里和修饰器模式很类似,但值得注意的一点是装饰器模式的对象从没变过,而静态模式变过。
不同点
- 装饰器模式是在功能外增强,并不会影响你这个类,原本是什么类最后也还是什么类。代理模式使用后,类会改变,不是原本的类了,而是代理的类。
- 装饰器模式仅仅提供功能增强不会增强的类有所牵制。代理模式会对类施加控制, 并不提供对象本身的增强功能,而是使用代理后的对象进行的增强。
需要看代理模式的可以看我的这个文章:装饰器模式
标签:zsp,Java3y,void,代理,模式,系列,设计模式,public 来源: https://blog.csdn.net/qq_42388853/article/details/117754728