大话设计模式:第7章 代理模式

第7章:代理模式

代理模式

代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。

在这里插入图片描述

Subject类,定义了RealSubjectProxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy

在这里插入图片描述

RealSubject类,定义了Proxy所代表的真实实体。

在这里插入图片描述

Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject相同的接口,这样代理就可以用来替代实体。

在这里插入图片描述

客户端代码

在这里插入图片描述

代理模式示例

任务:A通过代理送B礼物

在这里插入图片描述

from abc import ABC, abstractmethod
from typing import Text
# 追求者类
class SchoolGirl(object):
    def __init__(self) -> None:
        self._name = None
        
    @property
    def name(self) -> Text:
        return self._name
    @name.setter
    def name(self, name: Text):
        self._name = name
# 代理接口

class GiveGift(ABC):
    
    def __init__(self) -> None:
        pass
    
    @abstractmethod
    def give_doll(self) -> None:
        pass
    
    @abstractmethod
    def give_flower(self) -> None:
        pass
    
    @abstractmethod
    def give_chocolate(self) -> None:
        pass
    
# 追求者类

class Pursuit(GiveGift):
    
    def __init__(self, mm: SchoolGirl) -> None:
        self.mm = mm
    
    def give_doll(self) -> None:
        print(self.mm.name, " 送你洋娃娃")
    
    def give_flower(self) -> None:
        print(self.mm.name, " 送你鲜花")
    
    def give_chocolate(self) -> None:
        print(self.mm.name, " 送你巧克力")

# 代理类

class Proxy(GiveGift):
    
    def __init__(self, mm: SchoolGirl) -> None:
        self.gg = Pursuit(mm)
        
    def give_doll(self) -> None:
        self.gg.give_doll()
        
    def give_flower(self) -> None:
        self.gg.give_flower()
        
    def give_chocolate(self) -> None:
        self.gg.give_chocolate()
# 客户端代码

if __name__ == "__main__":
    
    mm = SchoolGirl()
    mm.name = "李娇娇"
    
    proxy = Proxy(mm)
    
    proxy.give_doll()
    proxy.give_flower()
    proxy.give_chocolate()
    
李娇娇  送你洋娃娃
李娇娇  送你鲜花
李娇娇  送你巧克力

代理模式应用

  1. 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实;

例:WebService在.NET中的应用

  1. 虚拟代理:根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象

例:HTML网页通过图片框加载图片

  1. 安全代理:用来控制真实对象访问时的权限

例:对象应该有不同的访问权限

  1. 智能指引:当调用真实的对象时,代理处理另外一些事

例:计算真实对象引用次数;第一次引用持久对象时,将它装入内存;访问实际对象前,检查是否已经锁定它

代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接,可以附加多种用途。

猜你喜欢

转载自blog.csdn.net/zhaoyin214/article/details/105769016
今日推荐