zoukankan      html  css  js  c++  java
  • 【编程思想】【设计模式】【结构模式Structural】适配器模式adapter

    Python版

    https://github.com/faif/python-patterns/blob/master/structural/adapter.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    *What is this pattern about?
    The Adapter pattern provides a different interface for a class. We can
    think about it as a cable adapter that allows you to charge a phone
    somewhere that has outlets in a different shape. Following this idea,
    the Adapter pattern is useful to integrate classes that couldn't be
    integrated due to their incompatible interfaces.
    
    *What does this example do?
    
    The example has classes that represent entities (Dog, Cat, Human, Car)
    that make different noises. The Adapter class provides a different
    interface to the original methods that make such noises. So the
    original interfaces (e.g., bark and meow) are available under a
    different name: make_noise.
    
    *Where is the pattern used practically?
    The Grok framework uses adapters to make objects work with a
    particular API without modifying the objects themselves:
    http://grok.zope.org/doc/current/grok_overview.html#adapters
    
    *References:
    http://ginstrom.com/scribbles/2008/11/06/generic-adapter-class-in-python/
    https://sourcemaking.com/design_patterns/adapter
    http://python-3-patterns-idioms-test.readthedocs.io/en/latest/ChangeInterface.html#adapter
    
    *TL;DR80
    Allows the interface of an existing class to be used as another interface.
    """
    
    
    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):
        """
        Adapts an object by replacing methods.
        Usage:
        dog = Dog
        dog = Adapter(dog, dict(make_noise=dog.bark))
    
        >>> objects = []
        >>> dog = Dog()
        >>> print(dog.__dict__)
        {'name': 'Dog'}
        >>> objects.append(Adapter(dog, make_noise=dog.bark))
        >>> print(objects[0].original_dict())
        {'name': 'Dog'}
        >>> cat = Cat()
        >>> objects.append(Adapter(cat, make_noise=cat.meow))
        >>> human = Human()
        >>> objects.append(Adapter(human, make_noise=human.speak))
        >>> car = Car()
        >>> car_noise = lambda: car.make_noise(3)
        >>> objects.append(Adapter(car, make_noise=car_noise))
    
        >>> for obj in objects:
        ...     print('A {} goes {}'.format(obj.name, obj.make_noise()))
        A Dog goes woof!
        A Cat goes meow!
        A Human goes 'hello'
        A Car goes vroom!!!
        """
    
        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 original_dict(self):
            """Print original object dict"""
            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()
    
    ### OUTPUT ###
    # {'name': 'Dog'}
    # {'make_noise': <bound method Dog.bark of <__main__.Dog object at 0x7f631ba3fb00>>, 'obj': <__main__.Dog object at 0x7f631ba3fb00>}
    # {'name': 'Dog'}
    # A Dog goes woof!
    # A Cat goes meow!
    # A Human goes 'hello'
    # A Car goes vroom!!!
    Python转载版
  • 相关阅读:
    windows2008R2新增磁盘处于脱机状态及介质写入受保护解决办法
    Oracle查询字段结果加单引号以及其他内容
    系统部署Oracle及cmd命令
    如何允许谷歌浏览器Adobe Flash Player一直运行
    浏览器被hao123篡改怎么办?
    Oracle数据库备份还原
    11_程序中的循环
    10_选择结构
    09_控制台输入
    08_运算符
  • 原文地址:https://www.cnblogs.com/demonzk/p/9035369.html
Copyright © 2011-2022 走看看