设计模式 —— 代理模式

代理模式也是“接口隔离”模式的一种。

动机

  • 在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或某些操作系统需要安全控制,或需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。
  • 如何在不失去透明操作对象的同时来管理、控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。

模式定义

对其他对象提供一种代理控制(隔离,使用接口)对这个对象的访问。    —— 《设计模式》GOF

结构

  •  Subject:定义RealSubject和Proxy的共用接口,。这样就可以在任何使用RealSubject的地方使用Proxy
  • RealSubject:真实处理业务的角色
  • Proxy:保存一个引用使得代理可以访问实体。提供一个与subject的接口相同的接口,这样代理就可以代替实体。

实现

实例:小明刚毕业参加工作,想在公司附近租一间房子,但是对环境又不熟悉,所以他想找一个房产中介来帮他租房。

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 // Subject
 7 class Person {
 8    public:
 9     virtual void rentHouse() = 0;
10 };
11 
12 // RealSubject
13 class XiaoMing : public Person {
14    public:
15     void rentHouse() { cout << "小明想租一间房子" << endl; }
16 };
17 
18 // Proxy
19 class Intermediary : public Person {
20    public:
21     Intermediary(Person* person) : m_Person(person) {}
22     void rentHouse() {
23         m_Person->rentHouse();
24         cout << "中介赚取佣金百分之十" << endl;
25     }
26 
27    private:
28     Person* m_Person;
29 };
30 
31 int main() {
32     //小明
33     Person* xiaoMing = new XiaoMing;
34     //找一个中介租房子
35     Person* intermediary = new Intermediary(xiaoMing);
36     intermediary->rentHouse();
37     return 0;
38 }
Proxy-example

要点总结

  • “增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方法。
  • 具体Proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做Proxy。
  • Proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。
原文地址:https://www.cnblogs.com/y4247464/p/15499064.html