python设计模式之适配器

来源:互联网 发布:mysql union or in 编辑:程序博客网 时间:2024/06/05 08:56

python设计模式之适配器

意图

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

适用性

  • 你想使用一个已经存在的类,而它的接口不符合你的需求
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作
  • 你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口

例子

# -*- coding:utf-8 -*-__author__ = 'Ricky'class Dog(object):    def __init__(self):        self.name = "Dog"    def bark(self):        return "woof!"class Car(object):    def __init__(self):        self.name = "Car"    def make_noise(self, octane_level):        return "vroom%s" % ("!" * octane_level)class Adapter(object):    """    Adapts an object by replacing methods.    Usage:    dog = Dog    dog = Adapter(dog, dict(make_noise=dog.bark))    """    def __init__(self, obj, adapted_methods):        """设置适配器对象和方法"""        self.obj = obj        # 可以对不兼容的adapted_methods方法进行加工改造        self.__dict__.update(adapted_methods)    def __getattr__(self, attr):        """获取指定对象"""        return getattr(self.obj, attr)def main():    objects = []    dog = Dog()    # 传入make_noise方法,使得适配器类得以通过make_noise方法来调用    objects.append(Adapter(dog, dict(make_noise=dog.bark)))    car = Car()    car_noise = lambda: car.make_noise(3)    objects.append(Adapter(car, dict(make_noise=car_noise)))    for obj in objects:        print "A", obj.name, "goes", obj.make_noise()if __name__ == "__main__":    main()output:A Dog goes woof!A Car goes vroom!!!
原创粉丝点击