首页 > 其他分享 >MEDIATOR(中介者)—对象行为型模式

MEDIATOR(中介者)—对象行为型模式

时间:2025-01-15 19:29:16浏览次数:3  
标签:窗口 对话框 对象 MEDIATOR 模式 一个 中介 组件

1. 意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2. 动机
面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。虽然将一个系统分割成许多对象通常可以增强可复用性, 但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作—系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为被分布在许多对象中。结果是, 你可能不得不定义很多子类以定制系统的行为。例如,考虑一个图形用户界面中对话框的实现。对话框使用一个窗口来展现一系列的窗口组件, 如按钮、菜单和输入域等。

1. 意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从
而使其耦合松散,而且可以独立地改变它们之间的交互。
2. 动机
面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对象。
虽然将一个系统分割成许多对象通常可以增强可复用性, 但是对象间相互连接的激增又会降低其可复用性。大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作—系统表现为一个不可分割的整体。而且,对系统的行为进行任何较大的改动都十分困难,因为行为被分布在许多对象中。结果是, 你可能不得不定义很多子类以定制系统的行为。例如,考虑一个图形用户界面中对话框的实现。对话框使用一个窗口来展现一系列的窗口组件, 如按钮、菜单和输入域等, 如下图所示。
通常对话框中的窗口组件间存在依赖关系。例如, 当一个特定的输入域为空时, 某个按钮不能使用;在称为列表框的一列选项中选择一个表目可能会改变一个输入域的内容;反过来,在输入域中输入正文可能会自动的选择一个或多个列表框中相应的表目;一旦正文出现在输入域中, 其他一些按钮可能就变得能够使用了,这些按钮允许用户做一些操作, 比如改变或删除这些正文所指的东西。
不同的对话框会有不同的窗口组件间的依赖关系。因此即使对话框显示相同类型的窗口组件, 也不能简单地直接重用已有的窗口组件类; 而必须定制它们以反映特定对话框的依赖关系。由于涉及很多个类,用逐个生成子类的办法来定制它们会很冗长。可以通过将集体行为封装在一个单独的中介者( m e d i a t o r )对象中以避免这个问题。中介者负责控制和协调一组对象间的交互。中介者充当一个中介以使组中的对象不再相互显式引用。这些对象仅知道中介者, 从而减少了相互连接的数目。
例如, F o n t D i a l o g D i r e c t o r可作为一个对话框中的窗口组件间的中介者。F o n t D i a l o g D i r e c t o r对象知道对话框中的各窗口组件,并协调它们之间的交互。它充当窗口组件间通信的中转中心,如下图所示。

下面的交互图说明了各对象如何协作处理一个列表框中选项的变化。

下面一系列事件使一个列表框的选择被传送给一个输入域:
1 ) 列表框告诉它的操作者它被改变了。
2 ) 导控者从列表框中得到选中的选择项。
3) 导控者将该选择项传递给入口域。
4 ) 现在入口域已有正文, 导控者使得用于发起一个动作(如“半黑体” ,“斜体”)的某个(某些)按钮可用。
注意导控者是如何在对话框和入口域间进行中介的。窗口组件间的通信都通过导控者间接地进行。它们不必互相知道; 它们仅需知道导控者。而且,由于所有这些行为都局部于一个类中,只要扩展或替换这个类, 就可以改变和替换这些行为。
这里展示的是F o n t D i a l o g D i r e c t o r抽象怎样被集成到一个类库中,如下图所示。

D i a l o g D i r e c t o r是一个抽象类, 它定义了一个对话框的总体行为。客户调用S h o w D i a l o g操作将对话框显示在屏幕上。C r e a t e Wi d g e t s是创建一个对话框的窗口组件的抽象操作。
Wi d g e t C h a n g e d是另一个抽象操作; 窗口组件调用它来通知它的导控者它们被改变了。
D i a l o g D i r e c t o r的子类将重定义C r e a t e Wi d g e t s以创建正确的窗口组件, 并重定义Wi d g e t C h a n g e d以处理其变化。

标签:窗口,对话框,对象,MEDIATOR,模式,一个,中介,组件
From: https://blog.csdn.net/workflower/article/details/145086331

相关文章

  • 商业模式画布BMC如何使用:提升企业战略规划力
    想象一下,你正站在一个充满无限可能的画布前,每一笔都可能勾勒出企业未来的蓝图。这不仅是一幅简单的画,而是一份战略地图——一份关于如何连接客户、创造价值、驱动收入的完整指南。这就是商业模式画布(BusinessModelCanvas,BMC),一个为企业设计和优化商业模式而生的神器。由亚历山......
  • 一文读懂Redis之哨兵(Sentinel)模式搭建
    目录一、环境规划二、Redis服务主从模式搭建步骤一、Master节点创建目录步骤二、Master节点下载Redis安装包步骤三、Master节点解压Redis安装包步骤四、Master节点进行make编译步骤五、Slave01节点、Slave02节点根据步骤一至步骤四安装Redis服务步骤六、Master节点修......
  • SpringBoot 插件化开发模式
    一、前言unsetunset1.1使用插件的好处1.1.1模块解耦实现服务模块之间解耦的方式有很多,但是插件来说,其解耦的程度似乎更高,而且更灵活,可定制化、个性化更好。举例来说,代码中可以使用设计模式来选择使用哪种方式发送短信给下单完成的客户,问题是各个短信服务商并不一定能保证......
  • Nginx+keepalived 双机热备(主从模式)
    负载均衡技术对于一个网站尤其是大型网站的web服务器集群来说是至关重要的!做好负载均衡架构,可以实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行。关于负载均衡介绍,可以参考:linux负载均衡总结性说明(四层负载/七层负载)由于业务扩展,网站的访问量不断加大,负载越来越高。......
  • 模式识别课程设计报告-Iris鸢尾花样本集多种分类算法实现
     课程实验报告,从前人的总结分享中学习借鉴了很多,上传记录,或许能帮到有需要的人。任务一:(1)从sklean中导入iris数据集(2)从CSV文件中导入iris数据集任务二:(1)利用sklearn中的model_selection.train_split()函数将样本集划分为训练集和测试集(2)定义一个函数plot_points(),该函数的功能......
  • 必知必会!JavaScript 开发中的反模式与避坑指南
    一、开发“雷区”:JavaScript反模式危机四伏JavaScript作为软件开发领域的多面手,在Web前端、后端乃至移动端开发中均占据着举足轻重的地位。然而,在实际的开发过程中,众多反模式如同隐藏在暗处的陷阱,时刻威胁着开发的顺利进行。这些反模式的产生,源于JavaScript灵活的语法......
  • Sigrity System SI SerialLink模式进行USB3.1协议仿真分析操作指导-SuperSpeedPlus_Rx
    SigritySystemSISerialLink模式进行USB3.1协议仿真分析操作指导-SuperSpeedPlus_Rx_HostSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协......
  • 设计模式-迭代器模式
    迭代器模式(IteratorPattern)解释定义迭代器模式是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。特点分离遍历集合与集合本身的实现。提供一种统一的方式来遍历不同类型的集合。使得集合的实现和迭代逻辑分离。......
  • 静态分析在分支开发主干发布模式下的应用
    静态分析在分支开发主干发布模式下的应用在采用分支开发主干发布模式的项目中,静态分析可以有效地确保每次合并到主干的代码质量。以下是具体的操作步骤和措施,确保变更请求经过审批,并在审批过程中检查静态分析的结果。1.配置管理工具和静态分析工具的集成目标确保静态分......
  • 第9章 常用的设计模式
    第9章常用的设计模式9.1聚合组件(aggregatecomponent)聚合组件将多个底层类型集中到一个简化的高层类型中,用于支持常用场景。例如,E-mail组件,把简单邮件传输协议(SMTP)、套接字、编码(encoding)等等集中在一起。聚合组件的目的是提供一个更高层的抽象,便于开发者完成(通常很简......