设计模式:适配器

设计模式:适配器

适配器起的就是一个我们容易理解的转接口的作用。它将连个对象或者类连接起来,使得两者的接口得到兼容,协同工作。它是一种结构型的设计模式。

适配器中存在三个主要角色:
目标抽象类(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()

Reference

[1] 二十三种设计模式及其python实现
[2] 设计模式:适配器模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值