Python设计模式Adapter Pattern例子详解

Python设计模式

3种类型:

 1. 创建型
    *灵活方式创建对象*
         - 抽象工厂
         - 建造者
         - 工厂方法
         - 原型
         - 单例
 2. 结构型
     *将一种对象改装为另一种对象,或将小对象合成大对象*
         - 适配器
         - 桥接
         - 组合
         - 修饰器
         - 外观
         - 享元
         - 代理
 3. 行为型
     *关注做事过程,算法及对象间的交互*
         - 责任链
         - 命令
         - 解释器
         - 迭代器
         - 中介者
         - 备忘录
         - 观察者
         - 状态
         - 策略
         - 模板方法
         - 访问者

适配器模式 Adapter Pattern

概念:

    是一种接口适配技术,可通过某个类来使用另一个接口与之不兼容的类。
    使用时,两个类的接口都无须改动。
场景:

    把某个类从其原先的应用场景中拿出来放在另一个环境中运行,而这个类又不能修改。
示例:

创建一个人,点击他会显示名字,说话。

 代码如下 复制代码

class Person(object): “"”A representation of a person in 2D Land””” def init(self, name): self.name = name def make_noise(self): return “hello”

def click_creature(creature): “"”React to a click by retrieving the creature’s name and what is says “”” return creature.name, creature.make_noise()

创建一只狗

 代码如下 复制代码

class Dog(object): “"”A representation of a dog in 2D Land””” def init(self, name): self.name = name def bark(self): return “woof”

狗只有bark,没有make_noise,需要适配。

 代码如下 复制代码

the Class Adapter
the Object Adapter
the Class Adapter
from dog import Dog
class Creature(object):
    """The base class for creatures in 2D Land"""
    def make_noise(self):
        """
        This is a technique to fake an ABC
        in Python 2.X
        """
        raise NotImplementedError

class Person(Creature):
    """A representation of a person in 2D Land"""
    def __init__(self, name):
        self.name = name

    def make_noise(self):
        return "hello"

class DogClassAdapter(Creature, Dog):
    """Adapts the Dog class through multiple inheritance"""
    def __init__(self, name):
        Dog.__init__(self, name)

    def make_noise(self):
        """
        Provide the 'make_noise' method that
        the client expects
        """
        return self.bark()
the Object Adapter
class DogObjectAdapter(Creature):
    """Adapts the Dog class through encapsulation"""
    def __init__(self, canine):
        self.canine = canine
    def make_noise(self):
        """This is the only method that's adapted"""
        return self.canine.bark()      
    def __getattr__(self, attr):
        """Everything else is delegated to the object"""
        return getattr(self.canine, attr)
*Simple *
from dog import Dog
class Person(object):
    """A representation of a person in 2D Land"""
    def __init__(self, name):
        self.name = name

    def make_noise(self):
        return "hello"

class DogAdapter(object):
    """Adapts the Dog class through encapsulation"""
    def __init__(self, canine):
        self.canine = canine

    def make_noise(self):
        """This is the only method that's adapted"""
        return self.canine.bark()

    def __getattr__(self, attr):
        """Everything else is delegated to the object"""
        return getattr(self.canine, attr)

def click_creature(creature):
    """
    React to a click by showing the creature's
    name and what is says
    """

    return (creature.name, creature.make_noise())
Test
from dog import Dog
from listing3 import Person, DogAdapter
def exercise_system():
    person = Person("Bob")
    canine = DogAdapter(Dog("Fido"))

    for critter in (person, canine):

        print critter.name, "says", critter.make_noise()

if __name__ == "__main__":
    exercise_system()

创建更多的生物,猫,鸟…
####

 代码如下 复制代码

class Cat(object):
    """A representation of a cat in 2D Land"""
    def __init__(self, name):
        self.name = name
    def meow(self):
        return "meow"

class CreatureAdapter(object):
    """Adapts a creature for clients in 2D Land"""
    def __init__(self, creature, make_noise):
        """Pass in the function to use as 'make_noise'"""
        self.creature = creature
        self.make_noise = make_noise
    def __getattr__(self, attr):
        """Everything else is delegated to the object"""
        return getattr(self.creature, attr)

测试

 代码如下 复制代码

from dog import Dog
from cat import Cat
from twodeeland import Person, CreatureAdapter
def exercise_system():
    person = Person("Bob")
    fido = Dog("Fido")
    canine = CreatureAdapter(fido, fido.bark)
    whiskers = Cat("Whiskers")
    feline = CreatureAdapter(whiskers, whiskers.meow)

    for critter in (person, canine, feline):
        print critter.name, "says", critter.make_noise

时间: 2024-11-08 23:01:36

Python设计模式Adapter Pattern例子详解的相关文章

Python中的下划线详解

  这篇文章主要介绍了Python中的下划线详解,本文讲解了单个下划线直接做变量名.单下划线前缀的名称.双下划线前缀的名称等内容,需要的朋友可以参考下 这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 一. 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _符号是指交互解释器中最后一次执行语句的返回结果.这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了. 代码如下: >>> _

Python中的默认参数详解

  这篇文章主要介绍了Python中的默认参数详解,本文讲解了默认参数的基本原理.如何正确地使用可变参数等内容,需要的朋友可以参考下 文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug. 基本原理 在 Python 源码中,我们使用def来定义函数或者方法.在其他语言中,类似的东西往往只是一一个语法声明关键字,但def却是一个可执行的

深入理解JavaScript系列(26):设计模式之构造函数模式详解

 这篇文章主要介绍了深入理解JavaScript系列(26):设计模式之构造函数模式详解,本文讲解了基本用法.构造函数与原型.只能用new吗?.强制使用new.原始包装函数等内容,需要的朋友可以参考下     介绍 构造函数大家都很熟悉了,不过如果你是新手,还是有必要来了解一下什么叫构造函数的.构造函数用于创建特定类型的对象--不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法. 基本用法 在

深入理解JavaScript系列(27):设计模式之建造者模式详解

 这篇文章主要介绍了深入理解JavaScript系列(27):设计模式之建造者模式详解,建造者模式可以将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,需要的朋友可以参考下     介绍 在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定.如何应对这种变化?如何提供一种"封装机制"来隔离出"复

深入理解JavaScript系列(28):设计模式之工厂模式详解

 这篇文章主要介绍了深入理解JavaScript系列(28):设计模式之工厂模式详解,工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类,需要的朋友可以参考下     介绍 与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类. 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口方法以便创建的时候指定自己的对象类型. 这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于

深入理解JavaScript系列(30):设计模式之外观模式详解

 这篇文章主要介绍了深入理解JavaScript系列(30):设计模式之外观模式详解,外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用,需要的朋友可以参考下     介绍 外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用. 正文 外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦.外观模式经常被认为开发者必备,它可以将一些复杂操作封装

深入理解JavaScript系列(31):设计模式之代理模式详解

 这篇文章主要介绍了深入理解JavaScript系列(31):设计模式之代理模式详解,代理模式使得代理对象控制具体对象的引用,代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西,需要的朋友可以参考下     介绍 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 代理模式使得代理对象控制具体对象的引用.代理几乎可以是任何对象:文件,资源,内存中的对象,或者是一些难以复制的东西. 正文 我们

深入理解JavaScript系列(33):设计模式之策略模式详解

 这篇文章主要介绍了深入理解JavaScript系列(33):设计模式之策略模式详解,策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户,需要的朋友可以参考下     介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很多时候都是按照swith语句来判断,但是这就带来几个问题,首先如果增加需求的话

深入理解JavaScript系列(35):设计模式之迭代器模式详解

 这篇文章主要介绍了深入理解JavaScript系列(35):设计模式之迭代器模式详解,迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示,需要的朋友可以参考下     介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 迭代器的几个特点是: 1.访问一个聚合对象的内容而无需暴露它的内部表示. 2.为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作. 3.遍历的同