设计模式(python实现)--桥接模式(Bridge)

2020-01-28  本文已影响0人  远行_2a22

动机(Motivation)

模式定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。
——《设计模式》GoF

要点总结

例子

消息类一方面需要实现业务相关loginsend_message等接口。比如精简版的登录仅登录即可,完美版的登录还需要播放声音等额外功能。
另一方面也要实现平台相关相关的play_sounddraw_shape等接口。

一般实现

# -*- coding: utf-8 -*-
class Massage(object):
    # 业务相关接口, 不同业务版本,实现不同
    def login(self, user_name, password):
        pass

    def send_message(self, message):
        pass

    def send_picture(self, picture):
        pass

    # 平台相关接口,不同平台实现不同
    def play_sound(self):
        pass

    def draw_shape(self):
        pass

    def write_text(self):
        pass

    def connect(self):
        pass


# ----------------平台实现-------------------

class PCMassageBase(Massage):
    def play_sound(self):
        print('PCMassageBase, play_sound')

    def draw_shape(self):
        print('PCMassageBase, draw_shape')

    def write_text(self):
        print('PCMassageBase, write_text')

    def connect(self):
        print('PCMassageBase, connect')


class MobileMassageBase(Massage):
    def play_sound(self):
        print('MobileMassageBase, play_sound')

    def draw_shape(self):
        print('MobileMassageBase, draw_shape')

    def write_text(self):
        print('MobileMassageBase, write_text')

    def connect(self):
        print('MobileMassageBase, connect')


# ------------业务抽象------------
class PCMassageLite(PCMassageBase):
    # 精简版
    def login(self, user_name, password):
        print('PCMassageLite, login')
        self.connect()

    def send_message(self, message):
        print('PCMassageLite, send_message')
        self.write_text()

    def send_picture(self, picture):
        print('PCMassageLite, send_picture')
        self.draw_shape()


class PCMassagePerfect(PCMassageBase):
    # 完美版
    def login(self, user_name, password):
        print('PCMassagePerfect, login')
        self.connect()
        self.play_sound()

    def send_message(self, message):
        print('PCMassagePerfect, send_message')
        self.write_text()
        self.play_sound()

    def send_picture(self, picture):
        print('PCMassagePerfect, send_picture')
        self.draw_shape()
        self.play_sound()


class MobileMassageLite(MobileMassageBase):
    # 精简版
    def login(self, user_name, password):
        print('MobileMassageLite, login')
        self.connect()

    def send_message(self, message):
        print('MobileMassageLite, send_message')
        self.write_text()

    def send_picture(self, picture):
        print('MobileMassageLite, send_picture')
        self.draw_shape()


class MobileMassagePerfect(MobileMassageBase):
    # 完美版
    def login(self, user_name, password):
        print('MobileMassagePerfect, login')
        self.connect()
        self.play_sound()

    def send_message(self, message):
        print('MobileMassagePerfect, send_message')
        self.write_text()
        self.play_sound()

    def send_picture(self, picture):
        print('MobileMassagePerfect, send_picture')
        self.draw_shape()
        self.play_sound()


if __name__ == '__main__':
    pc_massage_lite = PCMassageLite()
    pc_massage_lite.login('root', 123)
    mobile_massage_perfect = MobileMassagePerfect()
    mobile_massage_perfect.login('root', 123)

仔细阅读 ,会发现:

桥接模式实现

# -*- coding: utf-8 -*-


class Massage(object):
    # 业务相关接口, 不同业务版本,实现不同
    def __init__(self, massage_imp):
        self.massage_imp = massage_imp

    def login(self, user_name, password):
        pass

    def send_message(self, message):
        pass

    def send_picture(self, picture):
        pass


class MassageImp(object):
    # 平台相关接口,不同平台实现不同
    def play_sound(self):
        pass

    def draw_shape(self):
        pass

    def write_text(self):
        pass

    def connect(self):
        pass


# ----------------平台实现-------------------

class PCMassageImp(MassageImp):
    def play_sound(self):
        print('PCMassageImp, play_sound')

    def draw_shape(self):
        print('PCMassageImp, draw_shape')

    def write_text(self):
        print('PCMassageImp, write_text')

    def connect(self):
        print('PCMassageImp, connect')


class MobileMassageImp(MassageImp):
    def play_sound(self):
        print('MobileMassageImp, play_sound')

    def draw_shape(self):
        print('MobileMassageImp, draw_shape')

    def write_text(self):
        print('MobileMassageImp, write_text')

    def connect(self):
        print('MobileMassageImp, connect')


# ------------业务抽象------------
class MassageLite(Massage):

    def login(self, user_name, password):
        print('MassageLite, login')
        self.massage_imp.connect()

    def send_message(self, message):
        print('MassageLite, send_message')
        self.massage_imp.write_text()

    def send_picture(self, picture):
        print('MassageLite, send_picture')
        self.massage_imp.draw_shape()


class MassagePerfect(Massage):
    # 完美版
    def login(self, user_name, password):
        print('MassagePerfect, login')
        self.massage_imp.connect()
        self.massage_imp.play_sound()

    def send_message(self, message):
        print('MassagePerfect, send_message')
        self.massage_imp.write_text()
        self.massage_imp.play_sound()

    def send_picture(self, picture):
        print('MassagePerfect, send_picture')
        self.massage_imp.draw_shape()
        self.massage_imp.play_sound()


if __name__ == '__main__':
    pc_massage_imp = PCMassageImp()
    pc_massage_lite = MassageLite(pc_massage_imp)
    pc_massage_lite.login('root', 123)

    print('-'*30)
    mobile_massage_imp = MobileMassageImp()
    mobile_massage_perfect = MassagePerfect(mobile_massage_imp)
    mobile_massage_perfect.login('root', 123)

变化点主要有以下几点:

上一篇 下一篇

猜你喜欢

热点阅读