본문 바로가기
Study/디자인 패턴

[C#/Unity][디자인패턴] 중재자 패턴(Mediator Pattern)

by 스테디코디스트 2023. 12. 20.
반응형

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("--------------------------------------------------------");
        }
    }    
}

<참고 사이트>

 

중재자 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 중재자 패턴(mediator pattern), 조정자 패턴은 소프트웨어 공학에서 어떻게 객체들의 집합이 상호작용하는지를 함축해놓은 객체를 정의한다. 이 패턴은 프로그램

ko.wikipedia.org

 

중재자 패턴 (Mediator Pattern) 이란?

중재자 패턴 (Mediator Pattern) 이란? 여러 객체 간의 의사소통하는 방법을 추상화한다. 객체간의 혼란스러운 종속성을 줄일 수 있는 디자인 패턴이다. 객체간 직접적인 통신을 제한하고 중개자 객

jake-seo-dev.tistory.com

 

중재자 패턴(Mediator Pattern)

중재자 패턴(Mediator Pattern) 모든 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴이다. 즉, M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지 보수 및

www.crocus.co.kr

 

중재자 패턴

/ 디자인 패턴들 / 행동 패턴 중재자 패턴 다음 이름으로도 불립니다: 중개인, 컨트롤러, Mediator 의도 중재자는 객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 행동 디자인 패턴입니다. 이

refactoring.guru

 

[Design Pattern] 중재자 패턴(Mediator Pattern)

중재자 패턴(Mediator Pattern)은 객체간의 상호작용을 캡슐화하는 디자인 패턴으로 프로그램의 실행중 행위를 바꾸는 방법으로 Behavior Pattern에 속하게됩니다. 객체 지향 프로그래밍에서 프로그램은

velog.io

 

 

중재자 패턴

/ 디자인 패턴들 / 행동 패턴 중재자 패턴 다음 이름으로도 불립니다: 중개인, 컨트롤러, Mediator 의도 중재자는 객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 행동 디자인 패턴입니다. 이

refactoring.guru