design-pattern-of-python

Tags: python } patterns }

结构型设计模式有:

  • 适配器模式
  • 聚集模式
  • 桥接模式
  • 组合模式
  • 修饰模式
  • 扩充模式
  • 外观模式
  • 享元模式
  • 代理模式

适配器模式

将某个类的接口转换成客户端期望的另一个接口表示。适配器模式可以消除由于接口不匹配所造成的兼容性问题

下面的例子中,Adapter类实现了接口的统一调用。

class Dog(object):
    def __init__(self):
        self.name = "Dog"

    def bark(self):
        return "woof!"


class Cat(object):
    def __init__(self):
        self.name = "Cat"

    def meow(self):
        return "meow!"


class Human(object):
    def __init__(self):
        self.name = "Human"

    def speak(self):
        return "hello"


class Car(object):
    def __init__(self):
        self.name = "Car"

    def make_noise(self, octane_level):
        return "vroom{0}".format("!" * octane_level)


class Adapter(object):
    def __init__(self, obj, **adapted_methods):
        self.obj = obj
        self.__dict__.update(adapted_methods)

    def __getattr__(self, attr):
        return getattr(self.obj, attr)

    def original_dict(self):
        return self.obj.__dict__


def main():
    objects = []
    dog = Dog()
    print dog.__dict__
    objects.append(Adapter(dog, make_noise=dog.bark))
    print objects[0].__dict__
    print objects[0].original_dict()
    cat = Cat()
    objects.append(Adapter(cat, make_noise=cat.meow))
    human = Human()
    objects.append(Adapter(human, make_noise=human.speak))
    car = Car()
    objects.append(Adapter(car, make_noise=lambda: car.make_noise(3)))

    for obj in objects:
        print "A {0} goes {1}".format(obj.name, obj.make_noise())


if __name__ == "__main__":
    main()

还有一个更中规中矩的写法,从定义接口开始,这大概是所有面向对象的语言构建适配器结构的方法。

class EuropeanSocketInterface:
    def voltage(self):
        pass

    def live(self):
        pass

    def neutral(self):
        pass

    def earth(self):
        pass


class Socket(EuropeanSocketInterface):
    def voltage(self):
        return 230

    def live(self):
        return 1

    def neutral(self):
        return -1

    def earth(self):
        return 0


class USASocketInterface:
    def voltage(self):
        pass

    def live(self):

        pass

    def neutral(self):
        pass


class Adapter(USASocketInterface):
    __socket = None

    def __init__(self, socket):
        self.__socket = socket

    def voltage(self):
        return 110

    def live(self):
        return self.__socket.live()

    def neutral(self):
        return self.__socket.neutral()


class ElectricKettle:
    __power = None

    def __init__(self, power):
        self.__power = power

    def boil(self):
        if self.__power.voltage() > 110:
            print "Kettle on fire!"
        else:
            if self.__power.live() == 1 and \
               self.__power.neutral() == -1:
                print "Coffee time!"
            else:
                print "No power."


def main():
    socket = Socket()
    adapter = Adapter(socket)
    kettle = ElectricKettle(adapter)

    kettle.boil()

    return 0

if __name__ == "__main__":
    main()

参考文字:

example of adapter design pattern in python python patterns

外观模式

为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

享元模式

通过共享以便有效的支持大量小颗粒对象

代理模式

为其他对象提供一个代理以控制对这个对象的访问

Written on January 9, 2016