设计模式----适配器模式

Posted 幻觉czw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式----适配器模式相关的知识,希望对你有一定的参考价值。

#适配器模式
'''将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接
口不兼容而不能一起工作的那些类可以一起工作。'''

'''
适用场景:
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
3、在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。
'''
#待适配类
class Assassin(object):

    def __init__(self):
        self.name = "Assassin"
        self.weapon = "katana"
    def assassinate(self):
        return 'i will use my [%s] to attack!' \\
               % self.weapon

class Guard(object):

    def __init__(self):
        self.name = "Guard"
        self.weapon = "Sword"

    def attack(self):
        return 'i will use my [%s] to attack!' \\
               % self.weapon

class Archer(object):

    def __init__(self):
        self.name = "Archer"
        self.weapon = "Bow"

    def shoot(self):
        return 'i will use my [%s] to attack!' % \\
               self.weapon

#适配器
class Adapter(object):
    '''
    Adapts an object by replacing methods.
    Usage:
    guard = Guard()
    guard = Adapter(guard,dict(attack = guard.attack))
    '''
    def __init__(self,obj,adapted_methods): #更改和环境不一致的接口
        self.obj = obj
        self.__dict__.update(adapted_methods)

    #如果适配器类对象没有此方法,那就调用__getattr__方法,
    #在原待适配类对象中找这个方法或属性
    def __getattr__(self,attr):
        return getattr(self.obj,attr)

def main():
    killers = []
    assassin = Assassin()
    killers.append(Adapter(assassin,dict(attack = assassin.assassinate)))
    guard = Guard()
    killers.append(Adapter(guard,dict(attack = guard.attack)))
    archer = Archer()
    killers.append(Adapter(archer,dict(attack = archer.shoot)))
    for killer in killers :
        print killer.name,'--->',killer.attack()

if __name__ == '__main__':
    main()

以上是关于设计模式----适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷设计模式学习 --- [类适配器模式对象适配器模式接口适配器模式]

设计模式——适配器模式

设计模式:适配器模式(Adapter)

设计模式 结构型模式 -- 适配器模式(概述类适配器模式对象适配器模式适配器模式适用场景JDK源码解析(I / O流))

设计模式之(20)——适配器模式

设计模式之各种适配器