Introduktion:
Mediator pattern bruges til at at fjerne den stærke kobling mellem en række objekter, der har brug for at kommunikere sammen. Istedet for direkte at have kendskab til hinanden ligges ansvaret for kommunikationen over i et mediator objekt.
Motivation:
Det er ofte nødvendigt for en gruppe objekter, i en applikation, at kunne kommunikere med hinanden.
Dette kræver at objekterne har referencer til hindanden, hvilket kan resultere i et større netvær af referencer.
Dette vil gøre det svært at implementere ændringer i applikationen, da objekterne er tæt koblet til hinanden.
Fig. 1 Samarbejde mellem objekter
Dette medfører ofte at et objekt ikke kan arbejde uden at en række andre objekter også er tilstede, hvilket fører til at objekterne i applikationen ikke umiddelbart kan genbruges.
Det kan nogle gange være et ønske at f.eks. komplekse protokoller skal styres centralt og et centraliseret adgangspunkt er at foretrække.
Problem:
Det skal være muligt for en række objekter at kunne samarbejde uden at være stærk koblet til hinanden.
Det skal undgåes at objekterne bliver specialiserede til at indgå i et konkret samarbejde med hinanden.
Løsningen:
Løsningen er et Mediator pattern, som ligger et objekt i midten og "samler trådene".
Dens opgave er at formidle samarbejdet mellem objekterne.
Fig. 2 Mediator pattern
Dette gøres ved at:
• Delegere requests fra et objekt til et andet.
• Distribuere events mellem objekterne.
• Være et selvstændigt objekt i forhold til objekter uden for gruppen.
Mediator hjælper med at indkapsle kollektiv adfærd i et enkelt objekt.
Da objekterne ikke taler direkte til hinanden, bliver der en løsere kobling mellem objekterne.
Dette gør at udvikleren kan variere interaktionen individuelt.
Mediator giver et fælles samlingspunkt, centraliseret adfærd via dets interface.
Sourcekode til eksempel:
Mediator.java
ConcreteMediator.java
Colleague.java
OneColleague.java
NextColleague.java
I dette eksempel implementeres Mediator, så den håndterer kommunikation mellem colleague objekterne.
Når Mediator's metode colleagueChanged() kaldes, sammenlignes indholdet af det nye colleague objekt med et af de eksisterende colleague objekter.
Hvis der findes et objekt mage til, udskiftes indholdet af dens colleague objekt (NextColleague) med indholdet af det første colleague objekt (OneColleague).
Fig. 3 Eksempel på mediator pattern
Relaterede Patterns:
Facade Pattern - Mediator virker som en facade til de objekter der ønsker adgang til objektgruppen.
Observer Pattern - Mediator kan bruges til at holde styr på ændringer i en af colleague objekterne, og så underrette de andre colleague objekter.