Java筹划模式 十三 署理模式 (Proxy Pattern)

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
署理模式 (Proxy Pattern)

署理模式是一种结构型筹划模式,它为其他对象提供一种署理(或占位符)以控制对该对象的访问。通过署理模式,我们可以在不修改目标对象的情况下,控制对其的访问,添加额外的功能,比如懒加载、权限查抄、日志记录等。
署理模式主要通过为目标对象创建一个署理对象来代替真实对象,署理对象可以控制对目标对象的访问,并可以在访问时提供附加功能。

1. 署理模式的构成

署理模式通常包括以下脚色:


  • Subject(主题脚色): 定义了真实对象和署理对象的公共接口。真实对象和署理对象都需要实现这个接口。
  • RealSubject(真实主题脚色): 真实对象,定义了实际的业务利用逻辑。客户端可以通过署理对象来访问真实主题。
  • Proxy(署理脚色): 署理对象,控制对真实对象的访问。署理对象可能会执行一些额外的利用(如权限查抄、日志记录等),然后再委托给真实对象处理。
  • Client(客户端): 客户端通过署理对象来访问目标对象,而不是直接访问真实对象。

2. 署理模式的优点


  • 透明化访问: 客户端无需知道自己是在访问署理对象还是实际对象,署理对象通过与实际对象相同的接口来提供服务,提供了透明的访问方式。
  • 增强功能: 通过署理对象,能够在不改变目标对象的情况下,给目标对象添加额外的功能(如耽误加载、缓存、权限控制等)。
  • 耽误加载: 可以在署理对象中实现耽误加载,直到真正需要时才初始化目标对象。
  • 控制访问: 可以在署理对象中控制对真实对象的访问,比如添加安全查抄、日志记录等功能。

3. 署理模式的缺点


  • 性能开销: 署理模式可能会引入一些额外的性能开销,特别是署理对象需要进行额外的逻辑处理时,可能会影响性能。
  • 增长复杂性: 署理模式会增长系统的复杂性,由于它引入了署理对象而且需要协调署理和目标对象之间的关系。

4. 署理模式的实现

场景示例:银行账户的访问控制

假设我们有一个银行账户类,用户可以通过该类来进行资金的存取利用。为了安全起见,银行希望对这些利用进行日志记录和权限控制。因此,我们可以使用署理模式来实现:

  • 客户端直接利用署理对象。
  • 署理对象在执行利用进步行权限查抄、日志记录等,然后调用真实的银行账户利用。

1) 定义主题接口

首先定义一个接口,表现银行账户的根本利用。
  1. // 主题接口
  2. public interface BankAccount {
  3.     void deposit(double amount);
  4.     void withdraw(double amount);
  5.     double getBalance();
  6. }
复制代码

2) 实现真实对象

真实对象实现了 BankAccount 接口,并提供具体的业务利用。
  1. // 真实对象
  2. public class RealBankAccount implements BankAccount {
  3.     private double balance;
  4.     public RealBankAccount(double initialBalance) {
  5.         this.balance = initialBalance;
  6.     }
  7.     @Override
  8.     public void deposit(double amount) {
  9.         balance += amount;
  10.         System.out.println("Deposited " + amount + ", New balance: " + balance);
  11.     }
  12.     @Override
  13.     public void withdraw(double amount) {
  14.         if (amount <= balance) {
  15.             balance -= amount;
  16.             System.out.println("Withdrew " + amount + ", New balance: " + balance);
  17.         } else {
  18.             System.out.println("Insufficient funds!");
  19.         }
  20.     }
  21.     @Override
  22.     public double getBalance() {
  23.         return balance;
  24.     }
  25. }
复制代码

3) 实当署理对象

署理对象实现了 BankAccount 接口,并在方法调用时添加额外的功能(如权限控制和日志记录)。
  1. // 代理对象
  2. public class BankAccountProxy implements BankAccount {
  3.     private RealBankAccount realBankAccount;
  4.     public BankAccountProxy(double initialBalance) {
  5.         realBankAccount = new RealBankAccount(initialBalance);
  6.     }
  7.     @Override
  8.     public void deposit(double amount) {
  9.         logAction("deposit", amount);
  10.         realBankAccount.deposit(amount);
  11.     }
  12.     @Override
  13.     public void withdraw(double amount) {
  14.         logAction("withdraw", amount);
  15.         realBankAccount.withdraw(amount);
  16.     }
  17.     @Override
  18.     public double getBalance() {
  19.         return realBankAccount.getBalance();
  20.     }
  21.     private void logAction(String action, double amount) {
  22.         System.out.println("Logging: Action = " + action + ", Amount = " + amount);
  23.     }
  24. }
复制代码

4) 客户端代码

客户端通过署理对象来进行存款和取款利用,而不需要直接与真实对象交互。
  1. public class Client {
  2.     public static void main(String[] args) {
  3.         BankAccount account = new BankAccountProxy(1000);
  4.         // 客户端通过代理对象进行操作
  5.         account.deposit(500);
  6.         account.withdraw(200);
  7.         account.withdraw(1000);
  8.         System.out.println("Final balance: " + account.getBalance());
  9.     }
  10. }
复制代码

运行结果:

  1. Logging: Action = deposit, Amount = 500.0
  2. Deposited 500.0, New balance: 1500.0
  3. Logging: Action = withdraw, Amount = 200.0
  4. Withdrew 200.0, New balance: 1300.0
  5. Logging: Action = withdraw, Amount = 1000.0
  6. Withdrew 1000.0, New balance: 300.0
  7. Final balance: 300.0
复制代码
在这个例子中,署理对象 BankAccountProxy 在调用真实银行账户的利用之进步行了日志记录,增长了访问控制的功能,而客户端并不需要知道这些细节。

5. 署理模式的应用场景


  • 远程署理: 当一个对象位于差异的地址空间时,使用署理对象来控制对远程对象的访问(比方,远程方法调用(RMI))。
  • 虚拟署理: 耽误加载资源或对象,直到真正需要时才创建。比方,图像的加载和显示通常使用虚拟署理模式来避免不必要的资源加载。
  • 保护署理: 控制对真实对象的访问权限,比如验证用户的身份或权限。
  • 智能署理: 署理对象可以添加一些额外的功能,比如引用计数、缓存、内存管理等。
  • 缓存署理: 在署理中实现缓存功能,减少真实对象的重复访问。

6. 署理模式与其他模式的比较

筹划模式主要用途与署理模式的区别装饰模式动态地给对象添加额外的功能。装饰模式通常是给对象添加行为,而署理模式是控制对对象的访问。适配器模式将接口转化为客户端期望的接口,使得两个不兼容的接口可以协同工作。适配器模式用于接口适配,而署理模式用于控制访问。单例模式确保类只有一个实例并提供全局访问点。单例模式通常是限制实例数量,而署理模式是控制对对象的访问。
7. 总结

署理模式是一种非常实用的筹划模式,它通过引入署理对象来控制对真实对象的访问,从而为客户端提供附加的功能,比如权限控制、耽误加载、日志记录等。署理模式可以透明地为客户端提供真实对象的功能,同时避免客户端直接依赖目标对象,从而使得系统更具机动性和可扩展性。
在实际应用中,署理模式可以应用于许多场景,如远程署理、虚拟署理、保护署理和智能署理等。通过使用署理模式,能够在不改变目标对象的情况下,为目标对象添加额外的功能,同时有效地控制对象的访问。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表