In software engineering, 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.
Usually a program is made up of a large number of classes. Logic and computation are distributed among these classes. However, as more classes are added to a program, especially during maintenance and/or refactoring, the problem of communication 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.
Video Mediator pattern
Overview
The Mediator design pattern is one of the twenty-three well-known GoF 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.
Maps Mediator pattern
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 class diagram, 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 of how the interaction is carried out. The Mediator1
class implements the interaction between Colleague1
and Colleague2
.
The UML 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
ConcreteColleague - implements the Colleague interface and communicates with other Colleagues through its Mediator
Example
C#
The Mediator pattern ensures that components are loosely coupled, such that they don't 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.
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. Using raw sockets wouldn't allow for the delegate callbacks (people subscribed to the Mediator class' MessageReceived event).
Java
In the following example a mediator object controls the status of three collaborating buttons: for this it contains three methods (book()
, view()
and search()
) that set the status of the buttons. The methods are called by each button upon activation (via the execute()
method in each of them).
Hence here the collaboration pattern is that each participant (here the buttons) communicates to the mediator its activity and the mediator dispatches the expected behavior to the other participants.
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
- Mediator Design Pattern
- Is the use of the mediator pattern recommend? - Stack Overflow
Source of the article : Wikipedia