김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • local저장소
  • KMU_WINK
  • 로컬저장소
  • ㄱ
  • GitHubDesktop
  • 깃허브데스크탑
  • 원격저장소
  • Remote저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[디자인패턴] 중재자 패턴(Mediator Pattern)
• 독서/Design Pattern

[디자인패턴] 중재자 패턴(Mediator Pattern)

2022. 10. 11. 22:22

# 설명

https://refactoring.guru/design-patterns/mediator

 중재자 패턴(Mediator Pattern)은 N:M의 관계로 객체들의 소통이 이루어 지고 있는 복잡한 관계를 해결할 수 있다. N:M의 관계를 1:N의 관계로 바꾸어 준다.

만일 위 그림에서 관제탑이 없다면 각 비행기들은 서로 소통을 해야하지만, 관제탑(중재자)가 이러한 소통의 창구 역할을 해준다.

파사드 패턴, 옵저버 패턴과 유사함을 느낄 수 있다.

옵저버 패턴은 1:N의 관계였다. 즉, 신문사에서 새로운 기사가 나온다면 구독한 고객들에게 알림을 보내줬다. 그러나 구독자들은 신문사에게 알림을 보내지 않았다. 중재자 패턴은 각자가 알림을 보내기도 하고 받기도 한다고 생각하면 된다.

UI프로그래밍에서 많이 쓰인다. 각 Widget간의 연관관계가 많다. 예를들어 아이디를 입력하지 않았다면 로그인 버튼이 눌리지 않도록 해야한다. 이러한 관계들을 중재자를 만들어 전담하게 함으로써 각 객체간 소통하도록 하지 않는다.

  • Mediator : Colleague 객체와 교루하는데 필요한 인터페이스를 정의한다.
  • ConcreteMediator : Colleague간의 협력을 구현한다.
  • Colleague : Mediator의 참조자를 가지고 있다. 다른 객체와 상호작용이 필요할 경우 notify한다.

즉, Mediator를 사용함으로써 객체간 의존성을 중리고 결합도를 감소시킨다.

# 예제

  • 중재자를 통한 채팅방을 구현한다.
  • Colleague는 메시지를 보낼 수도 있고 받을 수도 있다.

## Mediator

// Mediator
public abstract class Mediator {
    ArrayList<Colleague> list;

    Mediator(){
        list = new ArrayList<Colleague>();
    }

    public void addUser(Colleague user){
        list.add(user);
    }

    public abstract void mediate(Colleague user, String msg);
}

## ConcreteMediator

// ChatApp
public class ChatApp extends Mediator{
    @Override
    public void mediate(Colleague user, String msg) {
        for( Colleague u : list){
            if ( u != user ) {
                u.recived(msg);
            }
        }
    }
}

## Colleague

// Colleague
public interface Colleague {
    public void recived(String msg);
    public void send(String msg);
}

## Concrete Colleague

// User
public class User implements Colleague{
    String name;
    Mediator mediator;

    User(String name, Mediator mediator){
        this.name = name;
        this.mediator = mediator;
    }

    @Override
    public void recived(String msg) {
        System.out.println(name + "님에게 메시지 도착 - " + msg);
    }

    @Override
    public void send(String msg) {
        System.out.println("@@@@" + name + "-> ALL : " + msg+ "@@@@@");
        mediator.mediate(this,msg);
    }
}

 

 

# 테스트

public class Test {
    public static void main(String[] args) {
        Mediator kakaoTalk = new ChatApp();

        Colleague hojun = new User("hojun",kakaoTalk);
        Colleague james = new User("james",kakaoTalk);
        Colleague tom = new User("tom",kakaoTalk);

        kakaoTalk.addUser(hojun);
        kakaoTalk.addUser(james);
        kakaoTalk.addUser(tom);

        hojun.send("내일 밥 뭐 먹을래? ");
        james.send("치김볶 ㄱㄱ");
        tom.send("난 낼 다이어트할거야 밥 안먹을래");
        
    }
}

 

저작자표시 (새창열림)

'• 독서 > Design Pattern' 카테고리의 다른 글

[클린소프트웨어#2] 익스트림프로그래밍(XP)에 대해서  (0) 2022.10.18
[클린소프트웨어#1] 애자일(Agile) 방법론과 4가지 가치와 12개의 원칙  (0) 2022.10.18
[디자인패턴] 퍼사드 패턴(Facade Pattern)  (0) 2022.10.11
[디자인 패턴] 메멘토 패턴(Memento Pattern)  (0) 2022.10.10
[디자인 패턴] 옵저버 패턴(Observer Pattern)  (1) 2022.10.04
    '• 독서/Design Pattern' 카테고리의 다른 글
    • [클린소프트웨어#2] 익스트림프로그래밍(XP)에 대해서
    • [클린소프트웨어#1] 애자일(Agile) 방법론과 4가지 가치와 12개의 원칙
    • [디자인패턴] 퍼사드 패턴(Facade Pattern)
    • [디자인 패턴] 메멘토 패턴(Memento Pattern)
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바