개요
중재자 패턴은 객체 간 상호작용을 중앙 집중화된 중재자를 통해 조정하는 디자인 패턴입니다.
객체들은 서로 직접 소통하지 않고 모든 통신은 중재자를 통해 이루어집니다.
각 객체는 중재자에게 메시지를 전달하고, 중재자는 해당 메시지를 받아 적절한 처리를 한 후 다른 객체에게 전달합니다.
이를 통해 객체들 간의 직접적인 연결이 필요 없어지며, 유지보수성과 확장성이 향상됩니다.
장단점
장점
- 낮은 결합도: 객체들 사이의 의존성이 줄어들어 시스템의 유연성이 증가합니다.
- 재사용성 향상: 객체들을 쉽게 재사용할 수 있으며, 다른 상황에서도 활용이 가능합니다.
- 복잡성 감소: 시스템의 복잡성을 줄여 관리하기 쉽습니다.
단점
- 중재자의 복잡성 증가: 중재자가 복잡해지면 유지보수가 어려워집니다.
- 성능 문제: 중재자의 처리 능력에 따라 전체 시스템의 성능이 영향을 받을 수 있습니다.
사용 사례
중재자 패턴은 UI 컴포넌트, 네트워크 프로그래밍 등 다양한 분야에서 사용됩니다. 예를 들어, UI 컴포넌트 간의 상호작용을 관리하거나 시스템 간의 메시지 교환에 활용됩니다.
using System;
using System.Collections.Generic;
// Mediator Interface
interface IChatMediator {
void SendMessage(string msg, IUser user);
void AddUser(IUser user);
}
// Concrete Mediator
class ChatRoom : IChatMediator {
private List<IUser> users;
public ChatRoom() {
this.users = new List<IUser>();
}
public void SendMessage(string msg, IUser user) {
foreach (IUser u in users) {
// message should not be received by the user sending it
if (u != user) {
u.Receive(msg);
}
}
}
public void AddUser(IUser user) {
this.users.Add(user);
}
}
// Colleague
abstract class IUser {
protected IChatMediator mediator;
protected string name;
public IUser(IChatMediator med, string name) {
this.mediator = med;
this.name = name;
}
public abstract void Send(string msg);
public abstract void Receive(string msg);
}
// Concrete Colleague
class ConcreteUser : IUser {
public ConcreteUser(IChatMediator med, string name) : base(med, name) {}
public override void Send(string msg) {
Console.WriteLine(this.name + ": Sending Message=" + msg);
mediator.SendMessage(msg, this);
}
public override void Receive(string msg) {
Console.WriteLine(this.name + ": Received Message:" + msg);
}
}
// Main class
class MediatorPatternDemo {
static void Main(string[] args) {
IChatMediator mediator = new ChatRoom();
IUser user1 = new ConcreteUser(mediator, "John");
IUser user2 = new ConcreteUser(mediator, "Doe");
IUser user3 = new ConcreteUser(mediator, "Smith");
IUser user4 = new ConcreteUser(mediator, "Jane");
mediator.AddUser(user1);
mediator.AddUser(user2);
mediator.AddUser(user3);
mediator.AddUser(user4);
user1.Send("Hi All");
}
}
반응형
'Programming > Design Pattern' 카테고리의 다른 글
비지터 패턴(Visitor Pattern) (0) | 2019.04.12 |
---|---|
서비스 로케이터 패턴 (Service Locator Pattern) (0) | 2018.02.19 |
애자일 설계 (0) | 2017.11.11 |
옵저버 패턴(Observer Pattern) (0) | 2015.12.15 |
스트래티지 패턴(Strategy Pattern) (0) | 2015.12.13 |
객체 지향 프로그래밍(OOP) (0) | 2015.12.12 |
디자인 패턴의 종류 (0) | 2015.08.16 |