sugar/ 九月 27, 2019/ python设计模式/ 0 comments

在某些应用中,我们想要在访问某个对象之前执行一个或多个重要的操作,例如,访问敏感信息——在允许用户访问敏感信息之前,我们希望确保用户具备足够的权限。操作系统中也存在类似的情况,用户必须具有管理员权限才能在系统中安装新程序。
上面提到的重要操作不一定与安全问题相关。延迟初始化是另一个案例:我们想要把一个计算成本较高的对象的创建过程延迟到用户首次真正使用它时才进行。
这类操作通常使用代理设计模式(Proxy design pattern)来实现。该模式因使用代理(又名替代,surrogate)对象在访问实际对象之前执行重要操作而得其名。

以下是四种不同的知名代理类型:

  • 远程代理:实际存在于不同地址空间(例如,某个网络服务器)的对象在本地的代理者。
  • 虚拟代理:用于懒初始化,将一个大计算量对象的创建延迟到真正需要的时候进行。
  • 保护/防护代理:控制对敏感对象的访问。
  • 智能(引用)代理:在对象被访问时执行额外的动作。此类代理的例子包括引用计数和线程安全检查

代码实现:

# coding: utf-8


class SensitiveInfo:

    def __init__(self):
        self.users = ['nick', 'tom', 'ben', 'mike']

    def read(self):
        print('There are {} users: {}'.format(len(self.users), ' '.join(self.users)))

    def add(self, user):
        self.users.append(user)
        print('Added user {}'.format(user))


class Info:

    '''SensitiveInfo的保护代理'''

    def __init__(self):
        self.protected = SensitiveInfo()
        self.secret = '0xdeadbeef'

    def read(self):
        self.protected.read()

    def add(self, user):
        sec = input('what is the secret? ')
        self.protected.add(user) if sec == self.secret else print("That's wrong!")


def main():
    info = Info()
    while True:
        print('1. read list |==| 2. add user |==| 3. quit')
        key = input('choose option: ')
        if key == '1':
            info.read()
        elif key == '2':
            name = input('choose username: ')
            info.add(name)
        elif key == '3':
            exit()
        else:
            print('unknown option: {}'.format(key))

if __name__ == '__main__':
    main()

我们使用代理模式实现一个实际类的替代品,这样可以在访问实际类之前(或之后)做一些额外的事情。存在四种不同的代理类型,如下所示。

  • 远程代理,代表一个活跃于远程位置(例如,我们自己的远程服务器或云服务)的对象。
  • 虚拟代理,将一个对象的初始化延迟到真正需要使用时进行。
  • 保护/防护代理,用于对处理敏感信息的对象进行访问控制。
  • 当我们希望通过添加帮助信息(比如,引用计数)来扩展一个对象的行为时,可以使用智能(引用)代理。
Share this Post

说点什么

avatar
  Subscribe  
提醒