중재자 (Mediator) 패턴 행동 패턴
한 집합에 속하는 여러 객체들 간의 상호 작용을 중재합니다. 객체들은 대상을 직접 알지 않고도 상호 작용을 할 수 있게 됩니다.
객체 지향 프로그래밍에서의 단일 책임 원칙에 의하면, 프로그램은 책임에 따라 여러 객체로 나뉘어지고 그 객체들 간의 상호 작용을 통해 프로그램의 실질적인 구현을 수행할 수 있게 된다. 하지만, 이 객체 구조가 복잡해질 경우 그들의 참조 관계는 기하급수적으로 늘어나 관리가 매우 어려워질 것이다. 이 때, 객체 구조가 복잡해지더라도 참조 관계를 하나의 객체로 정리할 수 있도록 하는 중재자 패턴을 사용할 수 있다.
중재자 (Mediator) 패턴은 상호 작용에 관련된 내용을 객체화함으로써 중재자 객체가 여러 객체들 간의 상호작용을 중재하게 된다. 오직 중재자 객체만이 상호 작용에 관련된 객체들을 참조하고, 객체가 상호 작용을 원하는 경우 중재자 객체를 통해 대상과의 상호 작용을 간접적으로 수행할 수 있도록 한다. 결과적으로 객체의 참조 관계는 다대다에서 중재자 객체에 의해 일대다로 축약되어진다.
중재자 패턴을 사용하면 객체들과의 참조관계를 단순화하여 객체들 간의 결합이 줄어 의존도가 감소된다. 또한 중재자 객체를 통해 객체들 간의 상호 관계를 명확하게 정의할 수 있고, 클라이언트는 이를 쉽게 이해할 수 있게 된다. 하지만, 중재자 객체에 상호 작용에 대한 구현이 집화되어 관리가 어려워질 수가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | public class PatternMediator { public abstract class Mediator { public abstract void Mediate(Colleague sender); } public class MediatorA : Mediator { private List<Colleague> _colleagues; public MediatorA() { _colleagues = new List<Colleague>(); } public void AddColleague(Colleague colleague) { _colleagues.Add(colleague); } public override void Mediate(Colleague sender) { foreach (Colleague colleague in _colleagues) { if (colleague != sender) { colleague.Operation(); } } } } public abstract class Colleague { private Mediator _mediator; public Colleague(Mediator mediator) { _mediator = mediator; } public void Mediate() { _mediator.Mediate(this); } public abstract void Operation(); } public class ColleagueA : Colleague { public ColleagueA(Mediator mediator) : base(mediator) { } public override void Operation() { Console.WriteLine("Operate ColleagueA"); } } public class ColleagueB : Colleague { public ColleagueB(Mediator mediator) : base(mediator) { } public override void Operation() { Console.WriteLine("Operate ColleagueB"); } } public static void Main(string[] args) { MediatorA mediator = new MediatorA(); ColleagueA colleagueA = new ColleagueA(mediator); ColleagueB colleagueB = new ColleagueB(mediator); mediator.AddColleague(colleagueA); mediator.AddColleague(colleagueB); colleagueA.Mediate(); colleagueB.Mediate(); } } | cs |
1 2 3 | Operate ColleagueB Operate ColleagueA Press any key to continue . . . | cs |
위의 예제에서 ColleagueA 객체와 ColleagueB 객체는 서로를 참조하지 않고 MediatorA 객체를 통해 서로에 대한 상호작용을 간접적으로 수행하여 서로의 Operation() 메소드를 호출하였다.
'PROGRAMMING > Design Pattern' 카테고리의 다른 글
[GoF] 방문자 (Visitor) 패턴 (0) | 2019.03.09 |
---|---|
[GoF] 템플릿 메서드 (Template Method) 패턴 (0) | 2019.03.09 |
[GoF] 반복자 (Iterator) 패턴 (0) | 2019.03.09 |
[GoF] 전략 (Strategy) 패턴 (0) | 2019.03.09 |
[GoF] 해석자 (Interpreter) 패턴 (0) | 2019.03.09 |