11-静态代理分析
静态代理
角色分析
-
抽象功能:用接口或抽象类解决
package com.ajream.demo01; public interface Rent { public void rent(); }
-
真实角色:被代理角色,比如房东
package com.ajream.demo01; public class Host implements Rent{ @Override public void rent() { System.out.println("房东出租了房子"); } }
-
代理角色:代理真实角色,一般会有些附属操作
package com.ajream.demo01; public class Proxy implements Rent{ Host host = new Host(); // 代理真实角色 public Proxy() { } public Proxy(Host host) { this.host = host; } // 中介帮房东租房子,但中介还会有一些附属操作 public void rent() { host.rent(); seeHouse(); qianHeTong(); } //中介的附属操作 public void seeHouse(){ System.out.println("中介带你看房子。。。"); } public void qianHeTong(){ System.out.println("签合同。。。"); } }
-
客户:访问代理对象的人
package com.ajream.demo01; import org.junit.Test; public class Client { @Test public void test(){ // 找房东租房子 Host host = new Host(); // 客户要租入房子,所以把房东丢给中介,让中介帮忙 Proxy p = new Proxy(host); p.rent(); } }
代理模式好处:
- 角色操作更加纯粹,不用取关注一些公共业务
- 公共业务交给代理角色,实现业务分工
- 公共业务发生扩展时,方便集中管理
缺点:
- 一个真实角色会产生一个代理角色,代码量翻倍
代理模式实现业务
用代理模式为业务添加日志打印功能
业务接口
package com.ajream.demo02;
//业务接口
public interface UserService {
void add();
void delete();
void update();
void query();
}
业务实现类(实现增删改查功能)
package com.ajream.demo02;
//业务实现
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("增加一个用户");
}
@Override
public void delete() {
System.out.println("删除一个用户");
}
@Override
public void update() {
System.out.println("修改一个用户");
}
@Override
public void query() {
System.out.println("查询一个用户");
}
}
【重点】业务代理类(添加日志打印功能)
package com.ajream.demo02;
public class UserServiceProxy implements UserService{
UserServiceImpl userService;
public UserServiceProxy() {
}
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
@Override
public void add() {
log("add");
userService.add();
}
@Override
public void delete() {
log("delete");
userService.delete();
}
@Override
public void update() {
log("update");
userService.update();
}
@Override
public void query() {
log("query");
userService.query();
}
//代理的额外操作,打印日志
public void log(String msg){
System.out.println("使用了" + msg + "方法" );
}
}
客户
package com.ajream.demo02;
import org.junit.Test;
public class Client {
@Test
public void test1(){
UserServiceImpl userService = new UserServiceImpl();
UserServiceProxy proxy = new UserServiceProxy();
proxy.setUserService(userService);
proxy.add();
}
}
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383519.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人