代理模式也叫做委托模式,指的是隐藏真实的对象,通过代理对象来实现对真实对象的操作。在现实生活中,有很多代理模式的实例。可以用买房来解释代理模式:
买房子通常有两种途径,一:开发商自己带客户去看房买房,二:和中介公司合作,由中介公司带客户看房买房、
对于第二种方式,就相当于开发商是真实的对象,被隐藏了,而中介公司就属于代理代理对象,其中中介公司也有带客户看房和买房的功能。但最终的交易还是通过开发商进行交易的。
通常来说分为三种角色,Subject(抽象主题)、RealSubject(真实对象,也叫做被代理对象),Proxy(代理对象)。
Subject
抽象主题角色:可以是抽象类,也可以是接口。抽象主题是一个普通的业务类型,无特殊要求。
RealSubject
真实主题角色:也叫做被委托角色或被代理角色,是业务逻辑的具体执行者,需要实现Subject,并实现所有的方法。
Proxy
代理主题角色:也叫做委托类或代理类。它是用来被其他使用者调用的,但是在该类中,对业务真实处理的逻辑是调用的RealSubject的。
重点:代理模式的主要作用是在不修改具体业务代码的情况下对相关功能进行扩张,比如增加日志,事务管理等。
静态代理我们通过前面介绍代理模式基本上能够清楚代理模式是用来做什么的,还是以上面买房的案例,我们利用静态代理模式,通过代码来实现它。
创建Subject角色
public interface BuyHouse {
void seeHouse();
void payForHouse();
}
创建RealSubject角色
//开发商
public class HouseS implements BuyHouse{
@Override
public void seeHouse() {
System.out.println("带客户看房!!!");
}
@Override
public void payForHouse() {
System.out.println("为房子付款!!!");
}
}
创建Proxy角色
public class HouseIntermediary implements BuyHouse{
private BuyHouse buyHouse;
//将真实对象委托给代理角色
public HouseIntermediary(BuyHouse buyHouse) {
this.buyHouse = buyHouse;
}
@Override
public void seeHouse() {
System.out.println("中介带客户!!!");
//代理角色中的逻辑处理实际上是调用的真实对象的方法
buyHouse.seeHouse();
}
@Override
public void payForHouse() {
System.out.println("中介带客户!!!");
buyHouse.payForHouse();
}
}
测试
public class StaticProxyTest {
public static void main(String[] args) {
BuyHouse buyHouse = new HouseS();
HouseIntermediary intermediary = new HouseIntermediary(buyHouse);
//所有的操作都是调用的代理对象,隐藏了真实对象
intermediary.seeHouse();
intermediary.payForHouse();
}
}
优点:
可以使得业务分工更加的纯粹,公共业务和实际业务拆离开来公共的业务(代理类)发生改变时,更加的集中和方便
缺点:
需要独有的代理类,造成类文件多了,工作量多了。如果Subject接口增加或者减少了内容,那么修改起来也比较麻烦。
查看文章全部内容,可去我的掘金:https://juejin.cn/post/7078122817383989261
原创不易!!!!



