中介者模式是一种行为设计模式,它通过引入一个中介者对象来封装多个对象之间复杂的交互关系,使对象之间不必相互引用,从而减少对象间的耦合。中介者模式可以很好的解耦这种依赖关系,所有类都只和中介者有关联,形成一种星状结构,通过中介者建立联系,而彼此不需要知道对方是谁,彼此独立,耦合性很低。,,优点:降低对象之间的耦合性,让对象易于被独立地调用。,,缺点:增加了系统的复杂度和运行时间。,,使用场景:当系统中存在多个对象之间需要互相调用时,可以使用中介者模式来解耦这些对象之间的关系。
在软件设计领域,为了解决某些特定问题,经常会使用到一些特定的设计模式,这些设计模式可以帮助我们更好地组织代码,提高代码的可读性和可维护性,本文将重点介绍一种名为“中介者模式”的设计模式。
中介者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个对象都有机会决定某一个动作的执行,这种模式的主要作用在于,将那些相互依赖的对象解耦,使得它们可以独立地改变彼此之间的交互。
中介者模式主要包括以下几个角色:
1、抽象中介者(AbstractMediator):定义一个统一的接口,用于协调各个参与者的行为。
2、具体中介者(ConcreteMediator):实现抽象中介者接口,负责处理各参与者之间的消息传递。
3、抽象参与者(AbstractParticipant):定义一个接口,表示参与者需要完成的任务。
4、具体参与者(ConcreteParticipant):实现抽象参与者接口,完成自己的任务。
下面我们通过一个具体的例子来说明中介者模式的用法,假设我们有一个在线书店系统,系统中有用户、书籍和评论三个角色,用户可以购买书籍,书籍可以添加评论,我们需要将这三个角色解耦,使得它们可以独立地改变彼此之间的交互。
我们定义一个抽象中介者(BookReviewService),它包含一个对抽象参与者(Comment)的引用列表,我们定义两个具体中介者(UserService和BookService),分别表示用户服务和书籍服务,我们定义两个抽象参与者(Comment)和(Book)。
from abc import ABC, abstractmethod class AbstractMediator(ABC): @abstractmethod def send_message(self, sender: "AbstractParticipant", receiver: "AbstractParticipant", message: str) -> None: pass class ConcreteMediator(AbstractMediator): def __init__(self): self.participants = set() def add_participant(self, participant: "AbstractParticipant") -> None: self.participants.add(participant) def remove_participant(self, participant: "AbstractParticipant") -> None: self.participants.remove(participant) def send_message(self, sender: "AbstractParticipant", receiver: "AbstractParticipant", message: str) -> None: print(f"{sender.__class__.__name__} sent a message to {receiver.__class__.__name__}: {message}") for participant in self.participants: if not isinstance(participant, type(sender)): self.send_message(sender, participant, message) elif not isinstance(participant, type(receiver)): self.send_message(participant, receiver, message) break class AbstractParticipant(ABC): @abstractmethod def handle_command(self, command: str) -> None: pass class ConcreteParticipant(AbstractParticipant): def __init__(self, name: str): self.name = name self.mediator = None def set_mediator(self, mediator: "ConcreteMediator") -> None: self.mediator = mediator mediator.add_participant(self) def handle_command(self, command: str) -> None: print(f"{self.name} received a command: {command}") if self.mediator is not None: self.mediator.send_message(self, self.mediator, command) class UserService(ConcreteParticipant): def handle_command(self, command: str) -> None: if command == "buy": print("UserService bought a book") else: super().handle_command(command) class BookService(ConcreteParticipant): def handle_command(self, command: str) -> None: if command == "add review": print("BookService added a review") else: super().handle_command(command)
在这个例子中,我们可以看到,当用户购买书籍时,UserService会发送一个命令给BookService;当BookService收到命令后,它会向所有关联的评论添加一条评论,这样一来,我们就实现了将用户、书籍和评论三个角色解耦的目标。