设计模式(十八)—— 中介者模式(定义、案例分析、特点、缺点)

本文详细介绍了设计模式中的中介者模式,旨在降低对象间复杂的相互引用,实现系统的松耦合。通过一个虚拟聊天室的场景,阐述了如何运用中介者模式,分析了其模式特点和潜在缺点,并探讨了适用情境。此外,还提及了中介者模式与迪米特法则的关系以及与外观模式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。


本篇讲解中介者模式。
对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。

正文

一、定义

中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

其实中介者更像是一个群一个班级。对于一个多对多的复杂关系中,为了避免各对象的直接调关联,就通过增加一个中介者,去帮我们负责处理及交接。如果直接关联,对于增加一个关系,或者关系中的一个对象改变了,其他与其有关联的也会随之改动,所以通过在两者之间添加一层,改动则各自改动,但是交互还是通过中介者。

中介者的作用
中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。

二、情景假设

某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。

三、情景分析

关于上面情景的类图(具体分析在下面)
在这里插入图片描述

如果说我们直接采用单纯的交互关系: (1) 系统结构复杂且耦合度高:每一个会员都与多个其他会员之间产生相互关联和调用,若一个会员对象发生变化,需要跟踪与之有关联的其他所有会员并进行处理,系统组件之间呈现一种较为复杂的网状结构,会员之间的耦合度高。 (2) 组件的可重用性差:由于每一个会员和其他会员之间都具有很强的关联,若没有其他组件的支持,一个组件很难被另一个系统或模块重用,这些组件表现出来更像一个不可分割的整体,而在实际使用时,我们往往需要每一个会员都能够单独重用,而不是重用一个由多个会员组成的复杂结构。 (3) 系统的可扩展性差:如果在上述系统中增加一个新的会员类,则必须修改与之交互的其他会员类的源代码,将导致多个类的源代码需要修改,这违反了“开闭原则”,可扩展性和灵活性欠佳。

所以便采用中介者模式解决上面的问题,

首先定义抽象中介者类AbstractChatroom(抽象聊天室类)

public abstract class AbstractChatroom
{
   
	public abstract void register(Member member);//添加用户进群统一的管理
	public abstract void sendText(String, from, String to, String message);
	public abstract void sendImage(String from, String to, String image);
}

抽象同事类Member(抽象会员类)

public abstract class Member{
   
	protected AbstractChatroom chatroom;
	protected String name;

	public Member(String name){
   
		this.name = name;
	}

	public String getName(){
   
		return name;
	}

	public void setName(String name){
   
		this.name = name;
	}

	public AbstractChatroom getChatroom(){
   
		return chatroom
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值