设计模式漫谈之中介者模式
天太热,失眠了,实在睡不下去,就再写篇文章来静静心吧,我为什么写设计模式,因为设计模式是思想上的东西,程序员的法宝之一就是编程思想。
在面向对象中,对象之间的认识是分角度的,比如A对象,B对象,如果A对象存了B对象的引用,那么从A对象的角度来说,A对象认识B对象,但是B对象不认识A对象,如果B对象也存了A对象的引用,这时,才能说A,B互相认识。
或者是A,B对象互相不认识,但是A,B对象都认识C对象,而C对象认识A,B对象,这样,可以通过C对象来间接让A,B对象互相认识,互相通信。扮演红娘角色,即中介角色。
对象之间的认识分区域性,比如在对象的整个生命中期都认识的对象(父母),或者是过客,我只在某个时间(时间即空间)认识的对象(某个旅游景点认识的驴友)。
比如种种原因,两个对象不想直接发生关系,就找一个中间人传话。
直接上例子,我来解释:
//抽象对象UnitedNations在方法中认识Country
abstract class UnitedNations
{
public abstract void Declare(string message, Country colleague);
}
//具体对象认识USA, Iraq 这两个对象在方法中认识Country这个对象
class UnitedNationsSecurityCouncil : UnitedNations
{
private USA colleague1;
private Iraq colleague2;
public USA Colleague1
{
set { colleague1 = value; }
}
public Iraq Colleague2
{
set { colleague2 = value; }
}
public override void Declare(string message, Country colleague)
{
if (colleague == colleague1)
{
colleague2.GetMessage(message);
}
else
{
colleague1.GetMessage(message);
}
}
}
//抽象对象认识UnitedNations 这个对象
abstract class Country
{
protected UnitedNations mediator;
public Country(UnitedNations mediator)
{
this.mediator = mediator;
}
}
//具体对象USA在整个生命周期中都认识mediator这个对象
class USA : Country
{
public USA(UnitedNations mediator)
: base(mediator)
{
}
public void Declare(string message)
{
mediator.Declare(message, this);
}
public void GetMessage(string message)
{
Console.WriteLine("美国获得对方信息:" + message);
}
}
//具体对象在整个生命中期都认识mediator
class Iraq : Country
{
public Iraq(UnitedNations mediator)
: base(mediator)
{
}
public void Declare(string message)
{
mediator.Declare(message, this);
}
public void GetMessage(string message)
{
Console.WriteLine("伊拉克获得对方信息:" + message);
}
}
/具体的中介对象
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
//c1 对象认识中介者
USA c1 = new USA(UNSC);
//c2对象也认识中介者
Iraq c2 = new Iraq(UNSC);
//中介者认识c1,c2两个对象
UNSC.Colleague1 = c1;
UNSC.Colleague2 = c2;
//c1说话,让中介者传话
c1.Declare("不准研制核武器,否则要发动战争!");
//同样c2发消息也是让中介者传话
c2.Declare("我们没有核武器,也不怕侵略。");
总结,对象之间的认识关系分区域性,在哲学中,区域性相当于时间性,对象认识另一个对象,必须可以访问另一个对象的空间,即另一个对象的引用。
老生常谈,编程的法宝之一就是编程思想。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?