设计模式:适配器
适配器起的就是一个我们容易理解的转接口的作用。它将连个对象或者类连接起来,使得两者的接口得到兼容,协同工作。它是一种结构型的设计模式。
适配器中存在三个主要角色:
目标抽象类(Target)
:这个类定义了用户所需要的接口。
适配器类(Adapter)
:适配器模式的核心所在,它可以调用另一个接口,连接Target和Adaptee。
适配者类(Adaptee)
:被适配的角色,有着用户所不希望但又想使用的接口。
下图描绘了三者之间的关系,前者是对象适配器,后者是类适配器。
适配器的存在,可以让我们在设计程序结构的时候,写出一些可以复用的类,而不必去特意关心输入的类型,起到很好的解耦合作用, 也可以自由灵活地更换适配者。
python实现
'''Adapter'''
import os
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%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):
"""We set the adapted methods in the object's dict"""
self.obj = obj
self.__dict__.update(adapted_methods)
def __getattr__(self, attr):
"""All non-adapted calls are passed to the object"""
return getattr(self.obj, attr)
def main():
objects = []
dog = Dog()
objects.append(Adapter(dog, dict(make_noise=dog.bark)))
cat = Cat()
objects.append(Adapter(cat, dict(make_noise=cat.meow)))
human = Human()
objects.append(Adapter(human, dict(make_noise=human.speak)))
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()