STUNUM

面有萌色,胸有丘壑。心有猛虎,细嗅蔷薇。

嗨,我是王鑫 (@stunum),一名 Python 开发者。


Python web开发,后端以Django框架为主,前端使用Vue.js...

python设计模式之适配器模式

适配器模式

意义:

将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适用性:
  • 你想使用一个已经存在的类,而它的接口不符合你的需求。

  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

  • (仅适用于对象Adapter )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

举例:
class A(object):
    def a(self):
        print("我是A类的a方法")

class B(object):
    def b(self):
        print("我是B类的b方法")

class C(object):
    def c(self):
        print("我是C类的c方法")

class Adapter(object):
    def __init__(self, classname, method):
        self.classname = classname
        self.__dict__update = method
    def __getattr__(self, attr):
        return getattr(self.classname, attr)

def test():
    objects = []
    AA = A()
    objects.append(Adapter(AA, dict(test=AA.a)))
    BB = B()
    objects.append(Adapter(BB, dict(test=BB.b)))
    CC = C()
    objects.append(Adapter(CC, dict(test=CC.c)))
    for obj in objects:
        obj.test()

test()

输出结果:

我是A类的a方法
我是B类的b方法
我是C类的c方法

核心思想是创建一个适配器类,通过__dict__将需要转化的类的方法注册到适配器,复写__getattr__使其在适配器函数查无方法的时候,执行getattr魔法方法。

最近的文章

python设计模式之桥接模式

桥接模式意义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用性: 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge 模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。 举例: ```class A(object):def run(self, name): print(f”my name...…

水滴石穿继续阅读
更早的文章

python设计模式之单例模式

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。意义: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。举例:class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance =...…

水滴石穿继续阅读