Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:中介者模式(Mediator)

设计模式:中介者模式(Mediator)

作者头像
firstxinjie
发布于 2025-05-08 08:25:01
发布于 2025-05-08 08:25:01
12400
代码可运行
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)
运行总次数:0
代码可运行

在 VFP 中你是否遇到过这样的场景:明明已经释放了表单,但是表单仍旧顽固的显示在屏幕中?好吧,这其实是因为某些引用没有被释放。在该设计模式下,更准确的说,是在代码中存在双向引用。

其实,还有一种更普遍的场景:你很烦躁的编写表单中的代码,为什么烦躁呢?因为一个控件要调用其他控件中的方法,密密麻麻,像蜘蛛网一样的毫无规律,小心翼翼的写完了,需求变了,开始骂娘......

是时候让中介者模式出场了。

简单的理解中介者模式,其实就是将蜘蛛网一样的控件调用改成星型结构。所有的控件围成一圈,中间添加一个中介者。各控件和中介者之间存在双向引用。

是不是感觉变的相对清晰了?

作为中间镇场子的中介者,我们可以先定义一个接口(模板):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class IMediator As Custom
	*** <summary>
	*** 中介者统一的调度方法
	*** </summary>
	*** <param name="toObject">发送者对象</param>
	*** <param name="tcMessage">事件</param>
	Procedure Notify(toObject As Object, tcMessage As String)
	Endproc

	Procedure Release()
	Endproc
Enddefine

基于此模式的特点,那么,所有外围组件至少需要继承自下面的模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class BaseComponent As Custom
	oMediator = .Null.

	Procedure Init(toMediator As IMediator)
		This.oMediator = m.toMediator
	Endproc

	Procedure SetMediator(toMediator As IMediator)
		This.oMediator = m.toMediator
	Endproc

	Procedure Release()
		Release This
	Endproc
Enddefine

假设存在以下两个组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class ComponentA As BaseComponent
	Procedure DoA()
		This.oMediator.Notify(This, "ONE")
	Endproc

	Procedure DoB()
		This.oMediator.Notify(This, "TWO")
	Endproc
Enddefine

Define Class ComponentB As BaseComponent
	Procedure Doc()
		? "ONE"
	Endproc

	Procedure DoD()
		? "TWO"
	Endproc
Enddefine

那么具体的中介者大概可以是以下的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Define Class ConcreteMediator As IMediator
	oComponentA = .Null.
	oComponentB = .Null.

	Procedure Init(toComponentA As BaseComponent, toComponentB As BaseComponent)
		With This
			.oComponentA = m.toComponentA
			.oComponentB = m.toComponentB
		Endwith
	Endproc

	Procedure Notify(toObject As Object, tcMessage As String)
		Do Case
			Case m.tcMessage == "ONE"
				This.oComponentB.Doc()

			Case m.tcMessage == "TWO"
				This.oComponentB.DoD()
		Endcase
	Endproc

	Procedure Release()
		With This
			If Vartype(.oComponentA) = "O"
				.oComponentA.oMediator = .Null.
				.oComponentB.oMediator = .Null.

				.oComponentA = .Null.
				.oComponentB = .Null.
			Endif
		EndWith

		Release This
	Endproc
Enddefine

所以,最后我们在程序中的代码大概就是以下的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public loComponentA As ComponentA, loComponentB As ComponentB, loConcreteMediator As ConcreteMediator
m.loComponentA = Createobject("ComponentA")
m.loComponentB = Createobject("ComponentB")

m.loConcreteMediator = Createobject("ConcreteMediator", m.loComponentA, m.loComponentB)
m.loComponentA.SetMediator(m.loConcreteMediator)
m.loComponentB.SetMediator(m.loConcreteMediator)

m.loComponentA.DoA()
m.loComponentA.DoB()

Clear 

? Vartype(m.loConcreteMediator)
? Vartype(m.loComponentA)
? Vartype(m.loComponentB)

m.loConcreteMediator.Release()
m.loComponentA.Release()
m.loComponentB.Release()

? Vartype(m.loConcreteMediator)
? Vartype(m.loComponentA)
? Vartype(m.loComponentB)

Debug 

VFP 和 C#/X# 的垃圾回收机制不同,因此,在 .NET 平台,代码没有 VFP 中那样“复杂”(具体参看后续文章......),但是,该设计模式在 VFP 中的应用确实可以解决一些很棘手的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 xinjie的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
中介者模式(Mediator)
中介者模式是一种行为型模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。
兜兜转转
2023/03/08
5300
中介者模式(Mediator)
设计模式:命令模式(Command)
命令模式也是行为模式中的一种。它也被称为动作、事务、Action、Transaction、Command。
firstxinjie
2025/05/02
970
设计模式:命令模式(Command)
设计模式:备忘录模式(Memento)
发起者是直接导致需要进行快照的对象状态变更的类。在 VFP 中,大致可以这样定义:
firstxinjie
2025/05/12
680
设计模式:备忘录模式(Memento)
设计模式:装饰器模式(Decorator)
相较于后者,装饰器模式结构更清晰,也更容易扩展。但是对于可视组件进行“装饰”,会增加布局的复杂性,以及考虑状态的同步。因此,对于简单的场景,可以直接继承,而对于复杂的场景则可以选择其他的设计模式。
firstxinjie
2025/05/18
1520
设计模式:装饰器模式(Decorator)
设计模式:组合模式(Composite)
大道至简,设计模式真的很奇妙。如果你还未领悟其中的精髓,请随我来(欢迎留言或私信报名参与下月开始的培训:VFP高效编程之设计模式)。
firstxinjie
2025/05/17
810
设计模式:组合模式(Composite)
VFP如何做一个超类,如此万物皆对象
所谓“超类”,也就是说,其他所有的类都是从它继承而来。.NET 中对 Object 类的描述如下:支持 .NET 类层次结构中的所有类,并为派生类提供低级别服务。 这是所有 .NET 类的最终基类;它是类型层次结构的根。换句话说,整个 .NET 平台上所有的类,都是从 Object 类继承而来。
加菲猫的VFP
2023/08/21
3090
VFP如何做一个超类,如此万物皆对象
设计模式:责任链模式(Chain of Responsibility)
责任链模式是行为模式中的一种。它允许将请求沿着潜在处理者链传递,直到其中一个处理者处理该请求。
firstxinjie
2025/04/29
1120
设计模式:责任链模式(Chain of Responsibility)
设计模式8之中介者模式
有这样一个场景,如果你有很多朋友,朋友与朋友之间也是朋友。如果你的QQ号码变化,你的所有朋友都需要知道,你会告诉你的朋友你的QQ号码变了,朋友再告诉他的朋友。这样所有的朋友都需要相互通知你的QQ号码变了,这样牵一发动全身,耦合性非常大。
Lvshen
2022/05/05
1700
设计模式8之中介者模式
设计模式:迭代器模式(Iterator)
从这句话里,基本可以理解“迭代”的含义:重复,以之前结果为起点的重复的动作。放置编程的语境中,迭代器可以认为是对一组特定算法的抽象。
firstxinjie
2025/05/06
1100
设计模式:迭代器模式(Iterator)
设计模式:建造者设计模式(Builder)(2)
关于该设计模式在 VFP 中的应用示例,我考虑了很久。最终决定以主程序的伪代码来做。它至少有两个作用:
firstxinjie
2025/04/19
940
设计模式:建造者设计模式(Builder)(2)
设计模式:状态模式(State)
按照标准的描述,该模式“让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。”
firstxinjie
2025/05/12
810
设计模式:状态模式(State)
设计模式:工厂方法模式(Factory Method)(2)
当年做一个项目时,还不懂什么是设计模式,仅仅是按照经验完成了需求。回头看看,就是暗合桥接模式。但是,在整个需求实现过程中,甲方需要我在已经设计好的标准业务逻辑中添加非标的需求,因为,在他们眼里,从业务角度来看,是自然的拓展。
firstxinjie
2025/04/23
860
设计模式:工厂方法模式(Factory Method)(2)
C#设计模式16——中介者模式的写法
中介者模式是一种行为型设计模式,它定义了一个中介者对象来封装一系列对象之间的交互。中介者模式可以使得对象间的交互更加松耦合,避免了对象之间的直接依赖,从而使系统更加灵活、易于扩展和维护。
明志德道
2023/10/21
1980
设计模式--中介者模式
中介者模式是一种行为型设计模式,它可使对象间的交互更松散、更有序,并且可以减少对象间的直接引用。在中介者模式中,一个中介对象封装了对象间的交互,使得对象间的交互更加灵活可扩展。
软件架构师Michael
2023/07/22
2710
设计模式:单例模式(Singleton)(1)
该模式的核心就是在一个应用程序生命周期中仅存在唯一的类实例。因此,在 VFP 中,最简单的实现方式就是在 VFP 主程序中存在类似下面的代码:
firstxinjie
2025/04/26
920
设计模式:单例模式(Singleton)(1)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“ 单一职责原则 ”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。 对于一个模块或者系统,可能由很多对象构成, 而且这些对象之间可能存在相互的引用 ,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使
黄规速
2022/04/14
3130
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
【设计模式】—— 中介者模式Mediator
  模式意图   使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。   这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与
用户1154259
2018/01/18
5690
【设计模式】—— 中介者模式Mediator
重温设计模式 --- 中介者模式
中介者模式是一种行为型设计模式,它用于减少对象之间的直接耦合,从而更好地维护代码的可扩展性和可维护性。
Niuery Diary
2023/10/22
1350
重温设计模式 --- 中介者模式
一个扩展的 InputBox() -- EmInputBox
VFP 的 InputBox() 函数仅仅允许单行文本,但是,如果需要多行文本,是不是就束手无策了呢?
firstxinjie
2024/12/06
1130
一个扩展的 InputBox() -- EmInputBox
设计模式之中介者模式(mediator模式)引入中介者模式中介者模式的实例中介者模式分析
大家想象一下有十个人要共同完成一个工作,他们要互相合作和沟通,并且根据对方的通知可能要改变自己的状态,但这通常会带来很多问题,流程过于复杂,使得每个人不仅要专注于自己的事情,还要与他人进行沟通,得到通知,需要兼顾很多状态的变化。这时候,我们考虑可以引入一个类似上帝视角的角色,就是引入一个中介者,他来负责接受每个人的通知,并将变化发送所需要的人去,就是要他来控制并调节工作的进度和细节,这个人往往是从整体考虑的,所以使得每个人工作者只需要考虑自己的问题,一旦有了变化,就通知仲裁者,交给仲裁者去决定就可以了。 所以最后就变成了,整个团队的交流过程,组员向中介者报告,中介者向组员下达只命令。 这在现实生活中也是常见的,每个部门通常都会有一个领导人,每个班级有一个班长,往往是班长负责接受同学们的信息,然后将上面的信息从班长这里发给同学们,这里的班长就相当于一个仲裁者,同学们就相当于组员。
desperate633
2018/08/22
7040
设计模式之中介者模式(mediator模式)引入中介者模式中介者模式的实例中介者模式分析
相关推荐
中介者模式(Mediator)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验