代理模式(为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性)
-
优点
1、代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用。
2、可以扩展目标对象的功能。
3、将客户端与目标对象分离,降低耦合。 -
缺点
1、代理模式会造成系统设计中类的数量增加,增加了系统的复杂度。
2、在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢。 -
例子:房子通过房产中介进行销售,限制房产中介对价格的改动,增加房产中介对房子的描述,类图如下
-
代理模式的主要角色
抽象类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
具体类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
代理类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。 -
代码实现
抽象类
/**
* 房屋信息
*/
public interface HouseInfo {
// 价格
void showPrice();
}
具体类
/**
* 房屋
*/
public class House implements HouseInfo {
private int price = 88;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public void showPrice() {
System.out.println("别墅:" + price + "元");
}
}
代理类
/**
* 房产中介
*/
public class HouseAgency implements HouseInfo {
private HouseInfo houseInfo;
@Override
public void showPrice() {
if (houseInfo == null) {
houseInfo = new House();
}
houseInfo.showPrice();
description();
}
// 描述
private void description(){
System.out.println("白菜价了,赶快买...");
}
}
测试
public class Test {
public static void main(String[] args) {
HouseAgency proxyManager = new HouseAgency();
proxyManager.showPrice();
}
}
// 运行结果
别墅:88元
白菜价了,赶快买...
- 常见代理应用
远程代理(Remote Proxy):这种方式使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求。
虚拟代理(Virtual Proxy):对于一些占用系统资源较多或者加载时间较长的对象,可以给这些对象提供一个虚拟代理。在真实对象创建成功之前虚拟代理扮演真实对象的替身,而当真实对象创建之后,虚拟代理将用户的请求转发给真实对象。
安全代理(Secure Proxy):对客户和服务器之间交互的信息做安全评估和处理,及时发现安全隐患或攻击,保障客户和服务器之间的通信安全。
缓冲代理(Cache Proxy):为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,从而可以避免某些方法的重复执行,优化系统性能。