大话设计模型 Task06:桥接、职责链、中介

news2024/11/17 23:54:01

目录

  • 一、桥接模式
    • 问题描述
    • 问题分析
    • 模式定义
    • 代码实现
  • 二、职责链模式
    • 问题描述
    • 问题分析
    • 模式定义
    • 代码实现
  • 三、中介模式
    • 问题描述
    • 问题分析
    • 模式定义
    • 优缺点
    • 代码实现
  • 四、命令模式(后补)
    • 问题描述
    • 问题分析
    • 模式定义
    • 代码实现
  • 五、享元模式(后补)
  • 六、解释器模式(后补)
  • 七、访问者模式(后补)

一、桥接模式

问题描述

对于不同品牌的手机,软件基本无法兼容。因此如果手机需要增加软件,就需要针对不同品牌的手机分别实现软件功能。

问题分析

对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

模式定义

合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。

聚合表示一种弱的’拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的’拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。
在这里插入图片描述

代码实现

# 手机软件抽象类
class HandsetSoft(object):
    def run(self):
        pass


# 手机软件具体类
class HandsetGame(HandsetSoft):
    def run(self):
        print("运行手机游戏")


class HandsetAddressList(HandsetSoft):
    def run(self):
        print("运行手机通讯录")


class HandsetMP3(HandsetSoft):
    def run(self):
        print("运行手机MP3播放")


# 手机品牌抽象类
class HandsetBrand(object):
    soft = None

    def set_handset_soft(self, soft):
        self.soft = soft

    def run(self):
        pass


# 手机品牌具体类
class HandsetBrandN(HandsetBrand):
    def run(self):
        self.soft.run()


class HandsetBrandM(HandsetBrand):
    def run(self):
        self.soft.run()


class HandsetBrandS(HandsetBrand):
    def run(self):
        self.soft.run()


if __name__ == '__main__':
    ab = HandsetBrandN()
    ab.set_handset_soft(HandsetGame())
    ab.run()

    ab.set_handset_soft(HandsetAddressList())
    ab.run()

    ab = HandsetBrandM()
    ab.set_handset_soft(HandsetGame())
    ab.run()

    ab.set_handset_soft(HandsetAddressList())
    ab.run()

在这里插入图片描述

二、职责链模式

问题描述

你把今天你向经理申请,经理没权利,然后向总监上报,总监也没权限,向总经理上报的事,写成代码来看看吧,注意哦,不一定是加薪,还有可能是请假申请等。

问题分析

可能会增加管理类别,那就意味着这里容易变化,我想把这些公司管理者的类别分别做成管理者的子类,这就可以利用多态性来化解分支带来的僵化。

模式定义

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在这里插入图片描述
好处:

  • 当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
  • 接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用[DP]。这也就大大降低了耦合度了。

代码实现

class Request(object):
    __requestType = None
    __requestContent = None
    __number = None

    def get_requestType(self):
        return self.__requestType

    def set_requestType(self, value):
        self.__requestType = value

    def get_requestContent(self):
        return self.__requestContent

    def set_requestContent(self, value):
        self.__requestContent = value

    def get_number(self):
        return self.__number

    def set_number(self, value):
        self.__number = value

    requestType = property(get_requestType, set_requestType)
    requestContent = property(get_requestContent, set_requestContent)
    number = property(get_number, set_number)


# 管理者
class Manager(object):
    superior = None

    def __init__(self, name):
        self.name = name

    def set_superior(self, superior):
        self.superior = superior

    def request_applications(self, request: Request):
        pass


# 经理类
class CommonManager(Manager):
    def __init__(self, name):
        super().__init__(name)

    def request_applications(self, request: Request):
        if (request.requestType == "请假") and (request.number <= 2):
            print(f'{self.name}:{request.requestContent} 数量{request.number} 被批准')
        else:
            if self.superior != None:
                self.superior.request_applications(request)


# 总监
class Majordomo(Manager):
    def __init__(self, name):
        super().__init__(name)

    def request_applications(self, request: Request):
        if (request.requestType == "请假") and (request.number <= 5):
            print(f'{self.name}:{request.requestContent} 数量{request.number} 被批准')
        else:
            if self.superior != None:
                self.superior.request_applications(request)


# 总经理
class GeneralManager(Manager):
    def __init__(self, name):
        super().__init__(name)

    def request_applications(self, request: Request):
        if (request.requestType == "请假"):
            print(f'{self.name}:{request.requestContent} 数量{request.number} 被批准')
        elif (request.requestType == "加薪") and (request.number <= 500):
            print(f'{self.name}:{request.requestContent} 数量{request.number} 被批准')
        elif (request.requestType == "加薪") and (request.number > 500):
            print(f'{self.name}:{request.requestContent} 数量{request.number} 再说吧')


if __name__ == '__main__':
    jinli = CommonManager('金利')
    zongjian = Majordomo('宗剑')
    zhongjingli = GeneralManager('钟精励')
    jinli.set_superior(zongjian)
    zongjian.set_superior(zhongjingli)

    request1 = Request()
    request1.requestType = "请假"
    request1.requestContent = "小菜请假"
    request1.number = 1
    jinli.request_applications(request1)

    request2 = Request()
    request2.requestType = "请假"
    request2.requestContent = "小菜请假"
    request2.number = 4
    jinli.request_applications(request2)

    request3 = Request()
    request3.requestType = "加薪"
    request3.requestContent = "小菜请求加薪"
    request3.number = 500
    jinli.request_applications(request3)

    request4 = Request()
    request4.requestType = "加薪"
    request4.requestContent = "小菜请求加薪"
    request4.number = 1000
    jinli.request_applications(request4)

在这里插入图片描述

三、中介模式

问题描述

需求是美国和伊拉克之间的对话都是通过联合国安理会作为中介来完成。

问题分析

美国和伊拉克都是国家,有一个国家抽象类和 两 个 具 体 国 家 类 就 可 以 了 。 但 ’ 联 合 国 ’ 到 底 是 Mediator 还 是 ConcreteMediator呢?
这要取决于未来是否有可能扩展中介者对象,比如你觉得联合国除了安理会,还有没有可能有其他机构存在呢?
联合国的机构还有如国际劳工组织、教科文组织、世界卫生组织、世界贸易组织等,很多的,所以Mediator应该是’联合国机构’,而’安理会’是一个具体的中介者。

模式定义

中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了’多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,比如刚才得到的窗体Form对象或Web页面aspx,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

优缺点

优点:

  • 中介者模式的优点首先是Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator;
  • 由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

缺点:

  • 具 体 中 介 者 类 ConcreteMediator 会 因 为 ConcreteColleague越来越多,而变得非常复杂,反而不容易维护了。
  • 由于ConcreteMediator控制了集中化,于是就把交互复杂性变为中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。

代码实现

# 联合国机构类
class UnitedNations(object):
    def declare(self,message,colleague):
        pass

# 国家类
class Country(object):
    def __init__(self,mediator:UnitedNations):
        self.mediator = mediator

# 美国类
class USA(Country):
    def __init__(self,mediator:UnitedNations):
        super().__init__(mediator)
    def declare(self,message):
        self.mediator.declare(message,self)
    def get_message(self,message):
        print("美国获得对方信息:"+message)

# 伊拉克类
class Iraq(Country):
    def __init__(self,mediator:UnitedNations):
        super().__init__(mediator)
    def declare(self,message):
        self.mediator.declare(message,self)
    def get_message(self,message):
        print("伊拉克获得对方信息:"+message)

# 联合国安理会
class UnitedNationSecurityCouncil(UnitedNations):
    __colleague1 = None
    __colleague2 = None
    def get_colleague1(self):
        return self.__colleague1
    def get_colleague2(self):
        return self.__colleague2
    def set_colleague1(self,value):
        self.__colleague1 = value
    def set_colleague2(self,value):
        self.__colleague2 = value
    colleague1 = property(get_colleague1,set_colleague1)
    colleague2 = property(get_colleague2,set_colleague2)
    def declare(self, message, colleague:Country):
        if colleague == self.colleague1:
            self.colleague2.get_message(message)
        else:
            self.colleague1.get_message(message)

if __name__ == '__main__':
    UNSC = UnitedNationSecurityCouncil()
    c1 = USA(UNSC)
    c2 = Iraq(UNSC)

    UNSC.colleague1 = c1
    UNSC.colleague2 = c2

    c1.declare("不准研制核武器,否则要发动战争!")
    c2.declare("我们没有核武器,也不怕侵略。")

四、命令模式(后补)

问题描述

问题分析

模式定义

代码实现

五、享元模式(后补)

六、解释器模式(后补)

七、访问者模式(后补)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面向制造业的文档管理

面向制造业的文档管理 借助DocuWare领先的文档管理和工作流程自动化解决方案&#xff0c;各行业制造商&#xff08;从金属制造和机器零件到生物技术和制药&#xff09;都可以获得具有成本效益的可持续解决方案&#xff0c;通过自动化工作流程&#xff0c;简化生产和管理流程。…

文件压缩与远程拷贝_Tar_Scp_Rsync

Tar 压缩文件类型分为&#xff1a;gzip,bzip2,xz.利用tar工具来解压&#xff0c;压缩。 tar common:#tar [option ] file_name -c 创建一个压缩包 -t 查看内容 -x 提取 -f 文件名&#xff08;必须用&#xff09; -v 详细过程 -j bzip2 -z gzip -J xz Meth: tar -czvf arch_n…

示波器应用(一)

程序同学有没有一种感觉&#xff0c;有时候看到游戏场景有一种难以言表的不舒服&#xff0c;但是又不知道画面到底为什么不舒服。美术同学看到好的作品想要”借鉴“&#xff0c;但是又无从下手。那么下面这套工具将会非常适合进行画面分析以及画面仿色。让程序看懂画面信息&…

Ansys Speos | 进行智能手机镜头杂散光分析

本例的目的是研究智能手机Camera系统的杂散光。杂散光是指光向相机传感器不需要的散光光或镜面光&#xff0c;是在光学设计中无意产生的&#xff0c;会降低相机系统的光学性能。 在本例中&#xff0c;光学透镜系统使用Ansys Zemax OpticStudio (ZOS)进行设计&#xff0c;并使用…

微信小程序会议OA-后台数据交互(首页)05

1.后台准备 1.1 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

Charles -抓不到包常见原因之证书过期失效处理方法

当出现环境配置正常但却无法抓包的时候&#xff0c;可能是因为证书失效了&#xff0c;这种情况移除旧证书&#xff0c;安装新的证书即可。 一、判断是否证书过期 iOS手机&#xff1a; 进入&#xff1a;设置 > 通用 > VPN与设备管理 > Charles Proxy CA... > 更多…

劲爆美女来袭,这不得用python高清保存防止她被封禁

前言 大家早好、午好、晚好吖 ❤ ~ 环境使用: Python 3.8 解释器 Pycharm 编辑器 模块使用: requests 数据请求 第三方模块 pip install requests <工具> re <正则表达式模块> 安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 pip install 模块…

密码学_AES加密算法

目录 简介 AES的加密过程如下&#xff08;以128位密钥为例&#xff09;&#xff1a; 异或运算 初始变换&#xff08;initial round&#xff09; 字节代换&#xff08;SubBytes&#xff09; 行位移&#xff08;ShiftRows&#xff09; 列混合&#xff08;MixColumns&#x…

Socket套接字(网络编程万字总结-附代码)

文章目录前言一、概念二、分类&#xff08;三类&#xff09;2.1 流套接字&#xff1a;使用传输层TCP协议2.2 数据报套接字&#xff1a;使用传输层UDP协议2.3 原始套接字三、UDP数据报套接字编程3.1 Java数据报套接字通信模型3.2 DatagramSocket API3.2.1 DatagramSocket 构造方…

Shell函数

1、 函数定义 格式一&#xff1a; function name() { Command sequence; } 格式二&#xff1a; name() { Command sequence); } 1、()内是没有参数的&#xff0c;他只是函数定义的固定格式。 2、第八行fun 是函数的调用(第一种方式) 2、 函数传参 1、在Shell中&#xff0c;调用…

Jina 实例秀|基于CLIP模型的跨模态视频搜索

不同于传统的关键词搜索&#xff0c;你不需要给每个视频素材人为地打上标签。使用开源产品 CLIP-as-service&#xff0c;输入画面的描述文本&#xff0c;直接搜索到对应的视频片段。CLIP 是一个强大的模型&#xff0c;能够很好地判别文本和图片是否相关&#xff0c;但将其集成到…

【LeetCode】验证二叉搜索树 [M]

98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。…

微信小程序框架02

目录 1.框架简介 2.视图层 View 2.2 WXML 2.3 WXSS 2.4 JS 3.事件 4.逻辑层 APP service 4.1 生命周期 4.2 页面路由 4.3模块化 1.框架简介 小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。 整个小程序框架系统分为两部…

山东大学机器学习课程资源索引

实验 完整实验代码获取 github repo 【ML实验4】多分类贝叶斯模型 【ML实验5】SVM&#xff08;手写数字识别、核方法&#xff09; 【ML实验6】K-means&#xff08;图像压缩&#xff09; 【ML实验7】人脸识别综合项目&#xff08;PCA、多分类SVM&#xff09; 一个PCA加速技巧 …

数据治理:企业数据治理蓝图

参考《一本书讲透数据治理》、《数据治理》等 文章目录企业数据治理体系企业数据治理9个要素企业数据治理4个层面企业数据治理之道企业数据治理之法企业数据治理之术企业数据治理之器企业数据治理体系 数据治理、数据管理、数据管控三者是什么关系&#xff1f;很多人都搞混&am…

【Spring(二)】IoC入门案例(XML版)

文章目录前言1.IoC入门案例总结前言 上篇文章我们讲了IOC和DI两个核心概念&#xff0c;本篇文章我们会在Spring的环境下来实现它们&#x1f4aa;&#x1f4aa;。 1.IoC入门案例 我们先来实现IoC也就是管理Bean的这套模式&#xff0c;我们先来说说这套程序应该怎么做&#xff0c…

深度学习Week12-训练自己的数据集(YOLOv5)

这周接着详细解析小白YOLOv5全流程-训练实现数字识别_牛大了2022的博客-CSDN博客_yolov5识别数字&#xff0c;上周入门教大家下载配置环境&#xff0c;如果没有的话请参考上周的文章深度学习Week11-调用官方权重进行检测&#xff08;YOLOv5&#xff09;_牛大了2022的博客-CSDN博…

《IDC MarketScape:2022全球通用计算机视觉厂商评估》出炉,腾讯云智能入选

近日&#xff0c;全球领先的IT市场研究和咨询公司IDC发布了2022年度《MarketScape&#xff1a;全球通用计算机视觉厂商评估》报告&#xff08;以下简称“报告”&#xff09;&#xff0c;腾讯云智能凭借在计算机视觉领域领先的技术积累、出色的产品能力和丰富的行业落地实践&…

案例分享:硬件敏捷

“没有人能够在硬件领域推动以两周为单位的循环迭代&#xff01;”当人们谈起敏捷方法在包含了硬件及软件产品开发时&#xff0c;第一反应都是类似的论调。然而&#xff0c;已经有一些团队&#xff0c;尝试将已有的可靠硬件开发理念与少量从敏捷软件中借鉴的新鲜思想结合&#…

系统日志- Journal and Rsyslog

Log文件 Rsyslog 的配置文件/etc/rsyslog.conf Rsyslog的旧的信息会在最前面&#xff0c;新的信息会在最下面。 tail -f /var/log/messages #可以动态监控日志信息logger 发送日志信息 logger -p user.notice #“内容” -p选项测试实验&#xff1a; 1.在/etc/rsyslog.d/文…