• 代理模式


    一、内容

    为其他对象提供一种代理以控制对这个对象的访问。简单的说就是自己不想去干的事情交给代理去干

    二、角色

    • 抽象实体
    • 实体
    • 代理

    三、适用场景

    • 远程代理:为远程的对象提供代理
    • 虚代理:根据需求创建很大的对象
    • 保护代理:控制对原始对象的访问,用于对象有不同访问权限时,比如只读不能写。

    四、优点

    • 远程代理:可以隐藏对象位于远程地址空间的事实
    • 虚代理:可以进行优化,例如根据要求创建对象
    • 保护代理:允许在访问一个对象时有一些附加的内务处理

    六、代码示例

     1 from abc import abstractmethod,ABCMeta
     2 
     3 class Subject(metaclass=ABCMeta):
     4     @abstractmethod
     5     def get_content(self):
     6         pass
     7 
     8 class RealSubject(Subject):
     9     def __init__(self,filename):
    10         self.filename = filename
    11         print("读取%s文件内容" % filename)
    12         f = open(filename)
    13         self.content = f.read()
    14         f.close()
    15 
    16     def get_content(self):
    17         return self.content
    18 
    19     def set_content(self, content):
    20         f = open(self.filename, 'w')
    21         f.write(content)
    22         f.close()
    23 
    24 
    25 class ProxyA(Subject):
    26     def __init__(self, filename):
    27         self.subj = RealSubject(filename)
    28 
    29     def get_content(self):
    30         return self.subj.get_content()
    31 
    32 class ProxyB(Subject):
    33     '''虚代理'''
    34     def __init__(self, filename):
    35         self.filename = filename
    36         self.subj = None
    37 
    38     def get_content(self):
    39         if not self.subj:  #if True 如果为空的时候,就去读取文本
    40             self.subj = RealSubject(self.filename)
    41         return self.subj.get_content()
    42 
    43 
    44 class ProxyC(Subject):
    45     '''保护代理'''
    46     def __init__(self, filename):
    47         self.subj = RealSubject(filename)
    48 
    49     def get_content(self):
    50         return self.get_content()
    51 
    52     def set_content(self):
    53         raise PermissionError
    54 
    55     # 写一个set_content
    56 
    57 b = ProxyB("abc.txt")
    58 print(b.get_content())
    代理模式
  • 相关阅读:
    POJ1222 EXTENDED LIGHTS OUT(熄灯问题)
    注解@AllArgsConstructor @NoArgsConstructor
    jwt
    校验手机号
    name* until
    java中valueof_JAVA String.valueOf()方法的用法说明(在JAVA中 BingDecime b1 = new BigDecimal(Double.toString)
    java 减法精度缺失_java double类型数据加减操作精度丢失解决方法
    java 中的Collection<? extends Object>c是什么意思
    mybatis <if test=""></if>标签0为null 无效的 踩坑
    JAVA8之妙用Optional解决判断Null为空的问题
  • 原文地址:https://www.cnblogs.com/morgana/p/8496327.html
Copyright © 2020-2023  润新知