设计模式——代理模式、外观模式

代理模式

代理模式作用为其他对象提供一种代理控制对这个对象的访问
代理模式一般涉及的对象有:
抽象对象:声明真实对象和代理对象的共同基类(接口)
**真实对象:**代理对象所代表的真实对象,是我们最终要引用的对象
**代理对象:**代理对象内部含有对真实对象的引用,从而可以操作真实对象,代理对象内部还有与真实对象共有的基类(接口),可以在任何时刻都能代替真实对象。代理对象可在执行对真实对象操作时,可以附加其它操作,相当于封装。
代理种类
远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
虚拟(Virtual)代理(图片延迟加载的例子):根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等

class sender_base:
    def __init__(self):
        pass
    def send_something(self, something):
        pass
class send_class(sender_base):
    def __init__(self, receiver):
        self.receiver = receiver
    def send_something(self, something):
        print("SEND " + something + ' TO ' + self.receiver.name)
class agent_class(sender_base):
    def __init__(self, receiver):
        self.send_obj = send_class(receiver)
    def send_something(self, something):
        self.send_obj.send_something(something)
class receive_class:
    def __init__(self, someone):
        self.name = someone
if '__main__' == __name__:
    receiver = receive_class('xiaohua')
    agent = agent_class(receiver)
    agent.send_something('agentinfo')
print(receiver.__class__)
print(agent.__class__)

在这里插入图片描述

外观模式

外观模式:外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式

优点
主要优点在于对客户屏蔽子系统组件,减少客户处理的对象数目加粗样式并使得子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;

缺点
其缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
使用情况:
适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。许多情况下,我么不想把内部复杂性暴露给客户端。外观模式有助于隐藏系统的内部复杂性,并通过一个简化的接口向客户端暴露必要的部分。
外观模式跟代理模式有点像,都是在客户端和目标类之间建一个中间的类,客户端不直接调用目标的类,而是通过先调用中间类的方法,由中间类来实现怎么调用目标类。

外观模式的目的:
通过建立一个中间类,把调用目标类的代码都封装好,例如有时候目标类有很多个,逐一得去调用它们会很麻烦,这样通过中间类封装好的接口,客户端的调用就好很简单。
使用外观模式的最常见理由一个复杂系统提供单个简单的入口点。引入外观之后,客户端代码通过简单地调用一个方法/函数就能使用一个系统。同时,系统内部并不会丢失任何功能,外观只是封装了内部系统

class wakeup:
    def run(self):
        print("起床...")
class bursh:
    def run(self):
        print("刷牙... 洗脸...")
class go:
    def run(self):
        print("拿上书包...去教室")
##外观类中封装了对子系统的操作
class facade:
    def __init__(self):
        self.wakeup_1=wakeup()
        self.brush_2=bursh()
        self.go_3=go()
    def runall(self):
        self.wakeup_1.run()
        self.brush_2.run()
        self.go_3.run()
if __name__=="__main__":
     facade=facade()
     facade.runall()


在这里插入图片描述
PS 欢迎补充和指正

发布了19 篇原创文章 · 获赞 3 · 访问量 3472

猜你喜欢

转载自blog.csdn.net/qq_43544005/article/details/89457135