10.Python_结构型模式_代理模式

1.定义

12
定义为对象提供一种代理以控制这种对象
角色抽象实体(Subject)
实体(RealSubject)
代理(Proxy)
优点**远程代理:**可以隐藏对象位于远程地址空间的事实
虚代理 : 可以进行优化,例如根据需求创建对象
**保护代理:**允许在访问一个对象的时候有一些附加的内务处理
缺点1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂
应用场景按职责来划分,通常有以下使用场景:
1.远程代理。
2.虚拟代理。
3.Copy-on-Write 代理。
4.保护(Protect or Access)代理。
5.Cache代理。
6.防火墙(Firewall)代理。
7.同步化(Synchronization)代理。
8.智能引用(Smart Reference)代理

2.示例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from abc import ABCMeta, abstractmethod


# 抽象实体
class Subject(metaclass=ABCMeta):
    @abstractmethod
    def get_content(self):
        pass

    @abstractmethod
    def set_content(self, content):
        pass


# 实体
class RealSubject(Subject):
    def __init__(self, filename):
        self.filename = filename
        f = open(filename, "r")
        self.content = f.read()
        f.close()

    def get_content(self):
        return self.content

    def set_content(self, content):
        f = open(self.filename, "w")
        f.write(content)
        f.close()


# 虚拟代理
class VirtualProxy(Subject):
    def __init__(self, filename):
        self.filename = filename
        self.subj = None

    def get_content(self):
        if not self.subj:
            self.subj = RealSubject(self.filename)
        return self.subj.get_content()

    def set_content(self, content):
        pass


# 保护代理
class ProtectedProxy(Subject):
    def __init__(self, filename):
        self.subj = RealSubject(filename)

    def get_content(self):
        return self.subj.get_content()

    def set_content(self, content):
        raise PermissionError("无写入权限")


if __name__ == '__main__':
    subj1 = RealSubject("new")
    print(subj1.get_content())

    subj2 = VirtualProxy("new")
    print(subj2.get_content())

    subj3 = ProtectedProxy("new")
    print(subj3.set_content("a"))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值