一.代理模式综述
代理(proxy)模式,顾名思义,就是通过中间代理人去操作对象。比如我们买房子,我们会通过房中介去购买房子一样。实际是为我们的对象去寻找一个替身,我们通过替身去操纵我们的对象。
- 被代理对象:远程对象,创建开销大的对象,需要远程控制的对象
- 代理模式:静态代理和动态代理(动态代理也叫JDK代理或者接口代理)
二.静态代理
定义: 静态代理使用的时候需要定义接口或者父类,被代理的对象(即目标对象)和代理对象需要同时继承相同父类或者相同接口。
示例:
租房子接口
package com.sdnu.proxypattern;
/**
* 提供租房的接口
*
* @author Beyong
* @date 2021/05/21 19:55
*/
public interface RentHouse {
/***
* description:
*
* @param
* @return []
*/
void renHouse();
}
租房子的实现类
package com.sdnu.proxypattern;
/**
* @author Beyong
* @Description person who really rent house
* @date 2021/05/21 20:38
*/
public class ReallyRentHouse implements RentHouse{
@Override
public void renHouse(){
System.out.println("rent a beautiful house");
}
}
代理人
package com.sdnu.proxypattern;
/**
* @author Beyong
* @Description person who really rent house
* @date 2021/05/21 20:38
*/
public class ReallyRentHouse implements RentHouse{
@Override
public void renHouse(){
System.out.println("rent a beautiful house");
}
}
顾客买房
package com.sdnu.proxypattern;
/**
* @author Beyong
* @Description client
* @date 2021/05/21 20:40
*/
public class Test {
public static void main(String[] args) {
/* 第一种租房,不用通过中介,直接找房东 */
RentHouse client = new ReallyRentHouse();
client.renHouse();
/* 第二中租房,通过中介 */
IntermediaryProxy agent = new IntermediaryProxy(client);
agent.renHouse();
}
}
运行结果:
我们通过UMl图也可以看出,我们买房有两种方式,一种通过房中介,另一种则直接向房东要房子。
我们通过代理的方式能使得我们的程序具有更强的扩展性,以租房为例,以后我们有房子要租出去,只需找放中介即可,我们要租房子,也可以找房中介即可。
优点: 在不改变目标的情况下,通过代理对象对目标进行扩展。
缺点: :代理对象需要与代理目标具有相同父类,所以需要很多代理对象,比如我们租车,需要通过车中介,不能通过房中介一样,需要产生许多的代理对象。
一旦接口增加新的方法,代理对象和目标对象都需要改变。
作者:Beyong
出处:Beyong博客
github地址:https://github.com/beyong2019
本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。