In
software engineering
Software engineering is a systematic engineering approach to software development.
A software engineer is a person who applies the principles of software engineering to design, develop, maintain, test, and evaluate computer software. The term ' ...
, the mediator pattern defines an object that
encapsulates how a set of objects interact. This pattern is considered to be a
behavioral pattern due to the way it can alter the program's running behavior.
In object-oriented programming, programs often consist of many
classes.
Business logic and
computation are distributed among these classes. However, as more classes are added to a program, especially during
maintenance and/or
refactoring
In computer programming and software design, code refactoring is the process of restructuring existing computer code—changing the '' factoring''—without changing its external behavior. Refactoring is intended to improve the design, structu ...
, the problem of
communication
Communication (from la, communicare, meaning "to share" or "to be in relation with") is usually defined as the transmission of information. The term may also refer to the message communicated through such transmissions or the field of inqu ...
between these classes may become more complex. This makes the program harder to read and maintain. Furthermore, it can become difficult to change the program, since any change may affect code in several other classes.
With the mediator pattern, communication between objects is encapsulated within a mediator object. Objects no longer communicate directly with each other, but instead communicate through the mediator. This reduces the dependencies between communicating objects, thereby reducing
coupling.
Overview
The Mediator
design pattern is one of the twenty-three well-known
design patterns that describe how to solve recurring design problems to design flexible and reusable object-oriented software, that is, objects that are easier to implement, change, test, and reuse.
What problems can the Mediator design pattern solve?
* Tight coupling between a set of interacting objects should be avoided.
* It should be possible to change the interaction between a set of objects independently.
Defining a set of interacting objects by accessing and updating each other directly is inflexible because it tightly couples the objects to each other and makes it impossible to change the interaction independently from (without having to change) the objects.
And it stops the objects from being reusable and makes them hard to test.
''Tightly coupled objects'' are hard to implement, change, test, and reuse because they refer to and know about many different objects.
What solution does the Mediator design pattern describe?
* Define a separate (mediator) object that encapsulates the interaction between a set of objects.
* Objects delegate their interaction to a mediator object instead of interacting with each other directly.
The objects interact with each other indirectly through a mediator object that controls and coordinates the interaction.
This makes the objects ''loosely coupled''. They only refer to and know about their mediator object and have no explicit knowledge of each other.
See also the UML class and sequence diagram below.
Definition
The essence of the Mediator Pattern is to "define an object that encapsulates how a set of objects interact". It promotes loose coupling by keeping objects from referring to each other explicitly, and it allows their interaction to be varied independently.
Client classes can use the mediator to send messages to other clients, and can receive messages from other clients via an event on the mediator class.
Structure
UML class and sequence diagram

In the above
UML
The Unified Modeling Language (UML) is a general-purpose, developmental modeling language in the field of software engineering that is intended to provide a standard way to visualize the design of a system.
The creation of UML was originally ...
class diagram
In software engineering, a class diagram in the Unified Modeling Language (UML) is a type of static structure diagram that describes the structure of a system by showing the system's classes, their attributes, operations (or methods), and the r ...
, the
Colleague1
and
Colleague2
classes do not refer to (and update) each other directly.
Instead, they refer to the common
Mediator
interface for controlling and coordinating interaction (
mediate()
), which makes them independent from one another with respect to how the interaction is carried out.
The
Mediator1
class implements the interaction between
Colleague1
and
Colleague2
.
The
UML
The Unified Modeling Language (UML) is a general-purpose, developmental modeling language in the field of software engineering that is intended to provide a standard way to visualize the design of a system.
The creation of UML was originally ...
sequence diagram shows the run-time interactions. In this example, a
Mediator1
object
mediates (controls and coordinates) the interaction between
Colleague1
and
Colleague2
objects.
Assuming that
Colleague1
wants to interact with
Colleague2
(to update/synchronize its state, for example),
Colleague1
calls
mediate(this)
on the
Mediator1
object, which gets the changed data from
Colleague1
and performs an
action2()
on
Colleague2
.
Thereafter,
Colleague2
calls
mediate(this)
on the
Mediator1
object, which gets the changed data from
Colleague2
and performs an
action1()
on
Colleague1
.
Class diagram

;Participants
Mediator - defines the interface for communication between ''Colleague'' objects
ConcreteMediator - implements the Mediator interface and coordinates communication between ''Colleague'' objects. It is aware of all of the ''Colleagues'' and their purposes with regards to inter-communication.
Colleague - defines the interface for communication with other ''Colleagues'' through its ''Mediator''
ConcreteColleague - implements the Colleague interface and communicates with other ''Colleagues'' through its ''Mediator''
Example
C#
The Mediator pattern ensures that components are
loosely coupled
In computing and systems design, a loosely coupled system is one
# in which components are weakly associated (have breakable relationships) with each other, and thus changes in one component least affect existence or performance of another comp ...
, such that they do not call each other explicitly, but instead do so through calls to a mediator. In the following example, the Mediator registers all Components and then calls their SetState methods.
interface IComponent
class Component1 : IComponent
class Component2 : IComponent
// Mediates the common tasks
class Mediator
A chat room could use the Mediator pattern, or a system where many ‘clients’ each receive a message each time one of the other clients performs an action (for chat rooms, this would be when each person sends a message). In reality using the Mediator pattern for a chat room would only be practical when used with
remoting
In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (l ...
. Using raw sockets would not allow for the
delegate callbacks
In computer programming, a callback or callback function is any reference to executable code that is passed as an argument to another piece of code; that code is expected to ''call back'' (execute) the callback function as part of its job. Thi ...
(people subscribed to the Mediator class’ MessageReceived event).
public delegate void MessageReceivedEventHandler(string message, string sender);
public class Mediator
public class Person
Java
In the following example, a
Mediator
object controls the values of several
Storage
objects, forcing the user code to access the stored values through the mediator. When a storage object wants to emit an event indicating that its value has changed, it also goes back to the mediator object (via the method
notifyObservers
) that controls the list of the observers (implemented using the
observer pattern
In software design and engineering, the observer pattern is a software design pattern in which an object, named the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by ...
).
import java.util.HashMap;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
class Storage
class Mediator
public class MediatorDemo
See also
*
Data mediation
* ''
Design Patterns,'' the book which gave rise to the study of design patterns in computer science
*
Design pattern (computer science), a standard solution to common problems in software design
References
External links
*
{{Design Patterns Patterns
Software design patterns
Articles with example C Sharp code
Articles with example Java code