代理模式是一种常见的设计模式,用于控制对对象的访问。在 Java 中,代理模式通常涉及创建一个代理类,该类充当了另一个对象的接口,以控制对该对象的访问。
代理模式基本介绍
【1】代理模式:为一个对象提供一个替身,以控制对目标对象的访问。即通过代理对象访问目标对对象对现的基础外的标对象的功能。
【2】被代理的对象可以是远程对象,创建开销大的对象或需要安全控制的对象。
【3】代理模式有不同的形式,主要有三种:静态代理、动态代理(又称JDK代理、接口代在内存动态的创建对象,目标要对现口,它也尾代动态代理,它口代代代,主可,主可代代,主可代代代,主可,对口代代代,的标
度。
【5】代理模式的主要缺点: 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢。 ②、增加了系统的复杂度。
主要涉及到以下几个核心角色:
-
抽象主题(Subject):
- 定义了真实主题和代理主题的共同接口,这样在任何使用真实主题的地方都可以使用代理主题。
-
真实主题(Real Subject):
- 实现了抽象主题接口,是代理对象所代表的真实对象。客户端直接访问真实主题,但在某些情况下,可以通过代理主题来间接访问。
-
代理(Proxy):
- 实现了抽象主题接口,并持有对真实主题的引用。代理主题通常在真实主题的基础上提供一些额外的功能,例如延迟加载、权限控制、日志记录等。
-
客户端(Client):
- 使用抽象主题接口来操作真实主题或代理主题,不需要知道具体是哪一个实现类。
Java代理模式案例,模拟购买房屋的情景
假设有一个买房的场景,有三个角色:买家(Buyer)、房产中介(RealEstateAgent)、房东(HouseOwner)。、
首先,我们有一个房产接口 House
:
然后,我们有一个房东类 HouseOwner
实现了房产接口,代表房屋的实际所有者:
接着,我们创建一个房产中介类 RealEstateAgent
,充当买家和房东之间的代理,并实现了房产接口
最后,我们有一个买家类 Buyer
,代表购房者,他们通过房产中介购买房屋:
// 房产接口
interface House {
void sell();
}
// 房东类,实现了房产接口
class HouseOwner implements House {
private String address;
public HouseOwner(String address) {
this.address = address;
}
@Override
public void sell() {
System.out.println("房东出售房屋:" + address);
}
}
// 房产中介类,实现了房产接口
class RealEstateAgent implements House {
private HouseOwner houseOwner;
public RealEstateAgent(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
@Override
public void sell() {
beforeSell();
houseOwner.sell();
afterSell();
}
private void beforeSell() {
System.out.println("房产中介协助处理文件工作和谈判");
}
private void afterSell() {
System.out.println("房产中介办理所有权转移手续");
}
}
// 买家类
public class HouseBuyingExample {
public static void main(String[] args) {
// 创建房东和房产中介对象
HouseOwner houseOwner = new HouseOwner("123 Main St.");
RealEstateAgent agent = new RealEstateAgent(houseOwner);
// 买家通过房产中介购买房屋
agent.sell();
}
}
这个示例中,房产中介类 RealEstateAgent
充当了买家和房东之间的代理,处理了房屋购买过程中的一些中间步骤,例如文件工作和所有权转移,而买家类 Buyer
则通过房产中介购买房屋。