1. 중재자 패턴이란?
- 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력하도록 하는 패턴.
- 소프트웨어 공학에서 어떻게 객체들의 집합이 상호작용하는지를 함축해놓은 객체를 정의
- 객체간의 상호작용을 캡슐화하는 디자인 패턴
- 중재자라는 객체 안에서 서로 다른 객체들을 캡슐화하여 객체들이 더 이상 직접적으로 상호작용하지 않고 중재자를 통해서만 커뮤니케이션하도록 함.
- 객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 패턴
2. 중재자 패턴을 사용하는 경우
- 객체 간의 많은 의존관계를 가지거나 상호작용이 복잡해질 때 사용.
- 일부 클래스들이 다른 클래스들과 단단하게 결합하여 변경하기 어려울 대 사용.
- 타 컴포넌트들에 너무 의존하여 다른 프로그램에서 컴포넌트를 재사용할 수 없는 경우 사용.
3. 중재자 패턴의 장점
- 커뮤니케이션에서의 의존성을 줄임
- 클래스간 결합을 느슨하게 만듦
- 복잡한 상호작용을 하기 위한 복잡한 관계를 단순화시킬 수 있음.(M:N -> M:1)
4. 중재자 패턴의 단점
- 특정 application에 맞춰져 개발이 되기 때문에 재사용이 어려움.
- 한 번 중재자를 이용하기 시작하면 이후 중재자를 없애기 어려움.
- 한 곳으로 의존성이 모두 몰려버릴 수 있음.
5. 코드 구현
1) 구조
- Mediator
: Colleague 객체간의 커뮤니케이션을 위한 인터페이스
- Colleague
: Mediator를 통해 다른 Colleague와 커뮤니케이션을 위한 인터페이스
- Concrete Mediator
: Mediator 구현체, Colleague들간의 상호 커뮤니케이션을 위해 Colleague 객체를 가지고 있으며 커뮤니케이션을 조정함.
- Concrete Colleagure
: Colleague 구현체.
2) 소스코드(C#)
using Microsoft.Win32;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace StudyCSharp
{
// Mediator - Colleague 객체간 커뮤니케이션을 위한 인터페이스
interface IMediator
{
// 커뮤니케이션할 객체들을 추가
void addUser(IUser user);
// 메세지 전송
void sendMessage(IUser user, string msg);
}
// Concrete Mediator - Mediator 구현체
class UserMessageMediator : IMediator
{
private List<IUser> userList = new List<IUser>();
public void addUser(IUser user)
{
userList.Add(user);
}
public void sendMessage(IUser user, string msg)
{
foreach (var item in userList)
{
// 자신이 아닌 다른 사용자인 경우 메시지를 받음
if (item != user) item.receive(msg);
}
}
}
// Colleague - Mediator를 통해 다른 Colleague와 커뮤니케이션을 위한 인터페이스
interface IUser
{
// Mediator 객체
IMediator mediator { get; set; }
// 메세지 수신
void receive(string msg);
// 메세지 전송
void send(string msg);
}
// Concrete Colleague - Colleague 구현체
class ManUser : IUser
{
public IMediator mediator { get; set; }
public ManUser(IMediator mediator)
{
this.mediator = mediator;
}
public void receive(string msg)
{
Console.WriteLine("남자가 상대의 메시지를 받았습니다.\t");
}
public void send(string msg)
{
Console.WriteLine("남자 曰: {0}\n", msg);
mediator.sendMessage(this, msg);
}
}
// Concrete Colleague - Colleague 구현체
class WomanUser : IUser
{
public IMediator mediator { get; set; }
public WomanUser(IMediator mediator)
{
this.mediator = mediator;
}
public void receive(string msg)
{
Console.WriteLine("여자가 상대의 메시지를 받았습니다.\t");
}
public void send(string msg)
{
Console.WriteLine("여자 曰: {0}\n", msg);
mediator.sendMessage(this, msg);
}
}
class AlienUser : IUser
{
public IMediator mediator { get; set; }
public AlienUser(IMediator mediator)
{
this.mediator = mediator;
}
public void receive(string msg)
{
Console.WriteLine("외계인이 상대의 메시지를 받았습니다.\t");
}
public void send(string msg)
{
Console.WriteLine("외계인 曰: {0}\n", msg);
mediator.sendMessage(this, msg);
}
}
class Program
{
static void Main(string[] args)
{
// 중재자 객체
IMediator mediator = new UserMessageMediator();
// 커뮤니케이션 객체
IUser man = new ManUser(mediator);
IUser woman = new WomanUser(mediator);
IUser alien = new AlienUser(mediator);
// mediator에 커뮤니케이션할 객체 man, woman, alien 추가
mediator.addUser(man);
mediator.addUser(woman);
mediator.addUser(alien);
// 메시지 송수신
Console.WriteLine("--------------------------------------------------------");
man.send("너 3대 몇 치니?");
Console.WriteLine("--------------------------------------------------------");
woman.send("나 한 400쯤?!");
Console.WriteLine("--------------------------------------------------------");
man.send("강하구나!");
Console.WriteLine("--------------------------------------------------------");
alien.send("안녕?");
Console.WriteLine("--------------------------------------------------------");
}
}
}
<참고 사이트>