设计模式之桥接模式Python实现

13 篇文章 1 订阅
12 篇文章 0 订阅

1.意图

将抽象部分和与它的实现部分分离,使它们都可以独立地变化。

2.别名

Handle/Body

3.动机

当一个抽象可能有多个实现的时,通常用继承来协调它们。抽象类定义对该抽象的接口而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地修改,扩充和重用。


简明的说如上图:

桥接模式就是要实现A1可以通过桥调用B1也可以调用B2,A2可以通过桥调用B1,也可以调用B2

由于有了这座桥,使得桥两边的随着两端不同的维度进行变化,同时两端的事物又通过桥存在着一定的联系。



类图


代码示例

#-*-encoding:utf-8-*-
# 桥接模式
# 抽象类:手机
class Phone(object):
     def __init__(self,name):
         self.name=name
     def connectImpl(self):
        pass
# 三星手机
class SamsungPhone(Phone):
     def __init__(self,name):
         # 调用父类构造方法的不同方式
         # Phone.__init__(self,name)
         super(SamsungPhone, self).__init__(name)
     def connectImpl(self):
         print '连接上了'+self.name
class XiaomiPhone(Phone):
    def __init__(self,name):
        # Phone.__init__(self, name)
        super(XiaomiPhone,self).__init__(name)
    def connectImpl(self):
        print '连接上了'+self.name
# 抽象类:电脑
class Computer(object):
    def __init__(self, phone,computerName):
        self.phone=phone
        self.computerName=computerName
    def connect(self):
        pass
# 华硕电脑
class ASUSComputer(Computer):
    def __init__(self,phone,computerName):
        Computer.__init__(self,phone,computerName)
    def connect(self):
        print self.computerName,
        self.phone.connectImpl()
# 戴尔电脑
class DellComputer(Computer):
    def __init__(self,phone,computerName):
        Computer.__init__(self,phone,computerName)
    def connect(self):
        print self.computerName,
        self.phone.connectImpl()
# 抽象类:人
class Person(object):
    def __init__(self,computer,name):
        self.computer=computer
        self.name=name
    def useComputer(self):
        pass
# 学生
class Student(Person):
    def __init__(self,computer,name):
        # Person.__init__(self,computer,name)
        super(Student,self).__init__(computer,name)
    def useComputer(self):
        print self.name+'使用',
        self.computer.connect()
# 教师
class Teacher(Person):
    def __init__(self,computer,name):
        # Person.__init__(self,computer,name)
        super(Teacher,self).__init__(computer,name)
    def useComputer(self):
        print self.name+'使用',
        self.computer.connect()
def main():
    # 华硕电脑连接上了小米手机A1
    ASUScomputer=ASUSComputer(XiaomiPhone('小米手机A1'),'华硕电脑A1')
    ASUScomputer.connect()
    xiaomiA2=XiaomiPhone('小米手机A2')
    print xiaomiA2.name
    # 华硕电脑连接上了三星手机B1
    ASUScomputer = ASUSComputer(SamsungPhone('三星手机B1'), '华硕电脑A1')
    ASUScomputer.connect()
    # 戴尔电脑连接上了三星手机B1
    dellcomputer=DellComputer(SamsungPhone('三星手机B1'), '戴尔电脑B1')
    dellcomputer.connect()
    # 戴尔电脑连接上了小米手机A1
    dellcomputer = DellComputer(XiaomiPhone('小米手机A1'), '戴尔电脑B1')
    dellcomputer.connect()
    # 学生A1使用华硕电脑A1连接上了小米手机A1
    student=Student(ASUSComputer(XiaomiPhone('小米手机A1'),'华硕电脑A1'),'学生A1')
    student.useComputer()
    # 老师B1使用戴尔电脑B1连接上了三星手机B1
    teacher=Teacher(DellComputer(SamsungPhone('三星手机B1'), '戴尔电脑B1'), '老师B1')
    teacher.useComputer()
if __name__=='__main__':
    main()




输出结果:

华硕电脑A1 连接上了小米手机A1
华硕电脑A1 连接上了三星手机B1
戴尔电脑B1 连接上了三星手机B1
戴尔电脑B1 连接上了小米手机A1
学生A1使用 华硕电脑A1 连接上了小米手机A1
老师B1使用 戴尔电脑B1 连接上了三星手机B1

4.适用性


1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。列如在程序运行时刻实现部分应可以被选择或者切换。

2.类的抽象以及它的实现都应该可以通过生成子类方法加以扩充。这时的桥接模式使你可以不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。

4.想对客户完全隐藏抽象的实现部分。

5.有许多类要生成,类的层次结构说明你必须得将一个对象分解成两个部分。

6.你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。


5.效果

1.分离接口及其实现部分 一个实现未必不变的绑定在一个接口上。抽象类的实现可以在运行进行配置,一个对象甚至可以在运行时刻改变它的实现。

2.提高可扩充行

3.实现细节对客户透明



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值