spring-静态代理模式
1 思维导图
2 角色分析
抽象角色 : 一般使用接口或抽象类,由代理角色和真实角色继承或实现,来保证二者具有部分相同的行为
真实角色 : 客户真正要访问的角色,由代理角色进行代理
代理角色 : 相当于是客户和真实角色的中介,访问真实角色后返回给客户,这中间可以添加一些自己的操作
客户 : 访问代理角色
3 代码示例
3.1 示例一
模拟房屋租赁
3.1.1抽象角色
//租房 public interface Rend { public void rend(); }
3.1.2 真实角色
public class Homeowner implements Rend{ @Override public void rend(){ System.out.println("房东出租了房子"); } }
3.1.3 代理角色
public class Proxy implements Rend{ private final Homeowner homeowner; public Proxy(Homeowner homeowner) { this.homeowner = homeowner; } //租房子 @Override public void rend(){ seeHouse(); deal(); this.homeowner.rend(); fare(); } //看房子 public void seeHouse(){ System.out.println("中介带你看房"); } //签租房协议 public void deal(){ System.out.println("中介带你签合同"); } //收中介费 public void fare(){ System.out.println("租房成功,中介收中介费"); } }
3.1.4 客户
public class Client { public static void main(String[] args) { Proxy proxy = new Proxy(new Homeowner()); proxy.rend(); } }
3.1.5 执行结果
3.2 示例二
模拟添加日志
3.2.1 抽象角色
public interface UserService { public void query(); public void add(); public void delete(); public void update(); }
3.2.2 真实角色
public class UserServiceImpl implements UserService{ @Override public void query() { System.out.println("查询用户"); } @Override public void add() { System.out.println("增加用户"); } @Override public void delete() { System.out.println("删除用户"); } @Override public void update() { System.out.println("修改用户"); } }
3.3.3 代理角色
public class UserServicePoxy implements UserService{ private UserServiceImpl userService; public void setUserService(UserServiceImpl userService) { this.userService = userService; } @Override public void query() { log("query"); userService.query(); } @Override public void add() { log("add"); userService.add(); } @Override public void delete() { log("delete"); userService.delete(); } @Override public void update() { log("update"); userService.update(); } //日志方法 private void log(String msg){ System.out.println("[DeBug]使用了"+msg+"方法"); } }
3.3.4 客户
public class Client { public static void main(String[] args) { UserServiceImpl userService = new UserServiceImpl(); UserServicePoxy userServicePoxy = new UserServicePoxy(); userServicePoxy.setUserService(userService); userServicePoxy.add(); userServicePoxy.delete(); userServicePoxy.query(); userServicePoxy.update(); } }
3.3.5 执行结果
4 总结
4 .1 优点
- 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共业务 .
- 公共业务由代理来完成 . 实现了业务的分工 ,
- 公共业务发生扩展时变得更加集中和方便 .
4.2 缺点 :
- 类多了 , 多了代理类 , 工作量变大了 . 开发效率降低 .
4.3 核心: 在不改变原有代码的基础上,对功能进行了扩充
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术