中介模式(python实现2)

相较前一个中介模式(python实现)来说,本例子实现了多个中介者的情况

from abc import ABCMeta, abstractmethod
from enum import Enum


class InteractiveObject:
    """进行交互的对象"""


class InteractiveObjectImplA:
    """实现类A"""


class InteractiveObjectImplB:
    """实现类B"""


class Mediator:
    """中介类"""

    def __init__(self):
        self.__interactive_obj_a = InteractiveObjectImplA()
        self.__interactive_obj_b = InteractiveObjectImplB()

    def interactive(self):
        """进行交互的操作"""
        # 通过self.__interactive_obj_a和self.__interactive_obj_b完成相应的交互操作


class DeviceType(Enum):
    """设备类型"""
    TypeSpeaker = 1
    TypeMicrophone = 2
    TypeCamera = 3


class DeviceItem:
    """设备项"""

    def __init__(self, id, name, type, is_default=False):
        self.__id = id
        self.__name = name
        self.__type = type
        self.__is_default = is_default

    def __str__(self):
        template = 'type: {} id: {} name: {} is_default: {}.'
        return template.format(self.__id,
                               self.__name,
                               self.__type,
                               self.__is_default)

    def get_id(self):
        return self.__id

    def get_name(self):
        return self.__name

    def get_type(self):
        return self.__type

    def is_default(self):
        return self.__is_default


class DeviceList:
    """设备列表"""

    def __init__(self):
        self.__devices = []

    def add(self, device_item):
        self.__devices.append(device_item)

    def get_count(self):
        return len(self.__devices)

    def get_by_idx(self, idx):
        """通过设备列表的id获取设备"""
        if idx < 0 or idx >= self.get_count():
            return None
        return self.__devices[idx]

    def get_by_id(self, id):
        """通过设备项的id匹配获取设备"""
        for item in self.__devices:
            if item.get_id() == id:
                return item
        return None


class DeviceMgr(metaclass=ABCMeta):

    @abstractmethod
    def enumerate(self):
        """枚举设备列表(在程序初始化时,有设备插拔时都要重新获取设备列表)"""

    @abstractmethod
    def active(self, device_id):
        """选择要使用的设备"""

    @abstractmethod
    def get_cur_device_id(self):
        """获取当前正在使用的设备id"""


class SpeakerMgr(DeviceMgr):
    """扬声器设备管理类"""

    def __init__(self):
        self.__cur_device_id = None

    def enumerate(self):
        """枚举设备列表(真实的项目应该通过驱动程序去读取设备信息,这里只用初始化来模拟)"""
        devices = DeviceList()
        devices.add(DeviceItem('369dd760', 'Realtek', DeviceType.TypeSpeaker))
        devices.add(DeviceItem('59357639', 'NVIDIA', DeviceType.TypeSpeaker, True))
        return devices

    def active(self, device_id):
        """激活指定的设备作为当前要用的设备"""
        self.__cur_device_id = device_id

    def get_cur_device_id(self):
        return self.__cur_device_id


class DeviceUtil:
    """设备工具类"""

    def __init__(self):
        self.__mgrs = {DeviceType.TypeSpeaker: SpeakerMgr()}
        # self.__microphone_mgr = MicrophoneMgr()
        # self.__camera_mgr = CameraMgr()

    def __get_device_mgr(self, type):
        return self.__mgrs[type]

    def get_device_list(self, type):
        return self.__get_device_mgr(type).enumerate()

    def active(self, type, device_id):
        self.__get_device_mgr(type).active(device_id)

    def get_cur_device_id(self, type):
        return self.__get_device_mgr(type).get_cur_device_id()


def test_devices():
    device_util = DeviceUtil()
    device_list = device_util.get_device_list(DeviceType.TypeSpeaker)
    print('麦克风设备列表')
    if device_list.get_count() > 0:
        # 设置第一个设备为要用的设备
        device_util.active(DeviceType.TypeSpeaker,
                           device_list.get_by_idx(0).get_id())
    for idx in range(device_list.get_count()):
        device = device_list.get_by_idx(idx)
        print(device)
    print('当前使用的设备:' + device_list.get_by_id(device_util.get_cur_device_id(DeviceType.TypeSpeaker)).get_name())

    
if __name__ == '__main__':
    test_devices()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中介模式是一种行为设计模式,它使得对象间的通信通过一个中介对象来进行,从而降低了对象间的直接耦合性。Python可以使用以下方式实现中介模式: ```python class Mediator: def __init__(self): self.colleague1 = Colleague1(self) self.colleague2 = Colleague2(self) def notify_colleague1(self, message): self.colleague2.process_message(message) def notify_colleague2(self, message): self.colleague1.process_message(message) class Colleague1: def __init__(self, mediator): self.mediator = mediator def send_message(self, message): self.mediator.notify_colleague2(message) def process_message(self, message): print(f"Colleague1 received message: {message}") class Colleague2: def __init__(self, mediator): self.mediator = mediator def send_message(self, message): self.mediator.notify_colleague1(message) def process_message(self, message): print(f"Colleague2 received message: {message}") ``` 在上面的代码中,我们定义了一个中介者 `Mediator` 和两个同事 `Colleague1` 和 `Colleague2`。中介者持有两个同事的实例,并且提供了通知同事的方法。当某个同事调用 `send_message` 方法时,它会将消息传递给中介者,中介者再将消息传递给另一个同事,从而完成了同事间的通信。 可以使用以下代码测试上述实现: ```python mediator = Mediator() colleague1 = Colleague1(mediator) colleague2 = Colleague2(mediator) colleague1.send_message("Hello from Colleague1!") colleague2.send_message("Hello from Colleague2!") ``` 输出结果为: ``` Colleague2 received message: Hello from Colleague1! Colleague1 received message: Hello from Colleague2! ``` 从输出结果可以看出,同事间的消息可以通过中介者进行传递,从而实现了对象间的解耦。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值