【设计模式】代理模式 详解
基本概念:
替代一个对象去完成某个功能
可以在此过程中对原功能做一些修饰
相当于中介
为什么要学习 代理模式?
因为代理模式是spring框架的AOP机制 的底层
分类:
静态代理:
使用步骤:
使用步骤:
- 功能接口
- 实体类
- 代理类
- 客户端类调用代理类的某方法,来间接访问实体类的某方法
好处:
- 可以是实体类的功能更加纯粹
不用去增加一些公共的业务功能- 公共业务交给代理角色。实现了业务的分工
- 公共业务拓展时,方便集中管理
缺点:
一个实体类需要一个代理对象,所需代码量巨大
那么,在这里,本人来通过个小例子展示下 静态代理模式:
小例子 —— 客户租房问题:
首先,本人来给出一个 租房接口:
package edu.youzg.proxy_study.core;
/**
* @Author: Youzg
* @CreateTime: 2020-04-29 11:53
* @Description:带你深究Java的本质!
*/
public interface Rent {
public void rentHouse();
}
现在,本人来给出一个房东实体类:
package edu.youzg.proxy_study.core;
/**
* @Author: Youzg
* @CreateTime: 2020-04-29 11:54
* @Description:带你深究Java的本质!
*/
public class Landlord implements Rent{
@Override
public void rentHouse() {
System.out.println("房东租房");
}
}
对于上面的类,本人来给出一个 中介代理类:
package edu.youzg.proxy_study.core;
/**
* @Author: Youzg
* @CreateTime: 2020-04-29 11:58
* @Description:带你深究Java的本质!
*/
public class Proxy implements Rent{
private Landlord landlord;
public Proxy() {
}
public Proxy(Landlord landlord) {
this.landlord = landlord;
}
// 代理新增的方法
public void checkHouse() {
System.out.println("代理带客户看房");
}
public void signContract() {
System.out.println("代理与客户签合同");
}
public void agencyFee() {
System.out.println("代理收取中介费");
}
@Override
public void rentHouse() {
checkHouse();
agencyFee();
System.out.println("代理找房东");
signContract();
landlord.rentHouse();
}
}
最后,本人来给出一个客户端测试类:
package edu.youzg.proxy_study.core;
/**
* @Author: Youzg
* @CreateTime: 2020-04-29 11:56
* @Description:带你深究Java的本质!
*/
public class Client {
public static void main(String[] args) {
// 房东要出租房屋
Landlord landlord = new Landlord();
// 中介帮房东出租房屋
Proxy proxy = new Proxy(landlord);
//客户只能通过中介租房
proxy.rentHouse();
}
}
现在,本人来展示下运行结果:
动态代理:
请观看本人博文 —— 《详解 动态代理》