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): def make_noise(self): class DogClassAdapter(Creature, Dog): def make_noise(self): def make_noise(self): class DogAdapter(object): def make_noise(self): def __getattr__(self, attr): def click_creature(creature): return (creature.name, creature.make_noise()) for critter in (person, canine): print critter.name, "says", critter.make_noise() if __name__ == "__main__": |
创建更多的生物,猫,鸟…
####
代码如下 | 复制代码 |
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): |
测试
代码如下 | 复制代码 |
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): |