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应用必不可少的技术
点击右上角即可分享
微信分享提示