zoukankan      html  css  js  c++  java
  • 设计模式之中介模式

    """
    中介模式:用一个中介对象来封装一系列的对象的交互,中介者使各对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变他们之间的交互
    比如:房客与房东之间的交互过程是由中介来承担的,房客不需要知道房东是谁,房东也不需要知道房客是谁,有什么问题,直接找找中介就可以了。
    中介模式的三个对象:交互对象、中介者、具体中介者
    """
    class InteractiveObject:
        """进行交互的对象"""
        pass
    
    
    class InteractiveObjectImplA:
        """实现类A"""
        pass
    
    
    class InteractiveObjectImplB:
        """实现类B"""
        pass
    
    
    class Meditor:
        """中介类"""
        def __init__(self):
            self.__interactiveObjA = InteractiveObjectImplA()
            self.__interactiveObjB = InteractiveObjectImplB()
    
        def interactive(self):
            """进行交互的操作"""
            # 通过self.__interactiveObjA和self.__interactiveObjB完成相应的交互操作
            pass
    
    
    # 客户端不可能分别与每个通信设备进行直接交互,可以在两者之间创建一个设备管理器
    from abc import ABCMeta, abstractmethod
    from enum import Enum
    
    
    class DeviceType(Enum):
        """设备类型"""
        TypeSpeaker = 1
        TypeMicrophone = 2
        TypeCamera = 3
    
    
    class DeviceItem:
        """设备项"""
        def __init__(self, id, name, type, isDefault=False):
            self.__id = id
            self.__name = name
            self.__type = type
            self.__isDefault = isDefault
    
        def __str__(self):
            return "type:" + str(self.__type) + " id:" + str(self.__id) + " name:" + str(self.__name) + " isDefault:" + str(self.__isDefault)
        
        def getId(self):
            return self.__id
    
        def getName(self):
            return self.__name
        
        def getType(self):
            return self.__type
    
        def isDefault(self):
            return self.__isDefault
    
    
    class DeviceList:
        """设备列表"""
        def __init__(self):
            self.__devices = []
    
        def add(self, deviceItem):
            self.__devices.append(deviceItem)
    
        def getCount(self):
            return len(self.__devices)
    
        def getByIdx(self, idx):
            if idx < 0 or idx >= self.getCount():
                return None
            return self.__devices[idx]
    
        def getById(self, id):
            for item in self.__devices:
                if(item.getId() == id):
                    return item
            return None
    
    class DeviceMgr(metaclass=ABCMeta):
        @abstractmethod
        def enumerate(self):
            """
            枚举设备列表
            (在程序初始化时,有设备插拔时都要重新获取设备列表
            """
            pass
    
        @abstractmethod
        def active(self, deviceId):
            """选择要是用的设备"""
            pass
    
        @abstractmethod
        def getCurDeviceId(self):
            """获取当前正在使用的设备ID"""
            pass
    
    class SpeakerMgr(DeviceMgr):
        """扬声器设备管理类"""
        def __init__(self):
            self.__curDeviceId = None
    
        def enumerate(self):
            devices = DeviceList()
            devices.add(DeviceItem("32ffqwq232-232dsdw3-23dws32-332dwd", "Realtek High Definition Audio", DeviceType.TypeSpeaker))
    
            devices.add(DeviceItem("d22d32333-ddsd23d3-dws3d2-d32dd2", "NVIDIA High Definition Audio", DeviceType.TypeSpeaker, True))
            return devices
    
        def active(self, deviceId):
            self.__curDeviceId = deviceId
    
        def getCurDeviceId(self):
            return self.__curDeviceId
    
    
    class DeviceUtil:
        """设备工具类"""
        def __init__(self):
            self.__mgrs = {}
            self.__mgrs[DeviceType.TypeSpeaker] = SpeakerMgr()
            # MicrophoneMgr和CameraMgr不再实现
            # self.__mgrs[DeviceType.TypeMicrophone] = MicrophoneMgr()
            # self.__mgrs[DeviceType.TypeCamera] = CameraMgr()
    
        def __getDeviceMgr(self, type):
            return self.__mgrs[type]
    
        def getDeviceList(self, type):
            return self.__getDeviceMgr(type).enumerate()
    
        def active(self, type, deviceId):
            self.__getDeviceMgr(type).active(deviceId)
    
        def getCurDeviceId(self, type):
            return self.__getDeviceMgr(type).getCurDeviceId()
    
    if __name__ == "__main__":
        deviceUtil = DeviceUtil()
        deviceList = deviceUtil.getDeviceList(DeviceType.TypeSpeaker)
        print("麦克风设备:")
        if deviceList.getCount() > 0:
            deviceUtil.active(DeviceType.TypeSpeaker, deviceList.getByIdx(0).getId())
        for idx in range(0, deviceList.getCount()):
            device = deviceList.getByIdx(idx)
            print(device)
        print("当前使用的设备:" + deviceList.getById(deviceUtil.getCurDeviceId(DeviceType.TypeSpeaker)).getName())
  • 相关阅读:
    Cannot retrieve the latest commit at this time.
    Github上搭建个人博客记录
    ESPCN超分辨率汇总
    ESPCN处理彩色图像代码
    配置caffe过程中,生成解决方案出错。无法打开包括文件: “gpu/mxGPUArray.h”
    未定义变量 "caffe" 或类 "caffe.reset_all"
    windows下caffe安装配置、matlab接口
    Python3:pyecharts数据可视化插件
    Django:用户登录实例
    Django:提交表单时遇到403错误:CSRF verification failed
  • 原文地址:https://www.cnblogs.com/loveprogramme/p/13081584.html
Copyright © 2011-2022 走看看