본문 바로가기
이론/GoF

[행동패턴] 중재자 패턴

by 혀끄니 2023. 8. 17.
728x90
  • 중재자(Mediator) 패턴

- 여러 객체들이 소통하는 방법을 캡슐화하는 패턴

- 여러 컴포넌트간의 결합도를 중재자를 통해 낮출 수 있다.

중재자패턴 적용 전

public class CleaningService {
    public void clean(Gym gym) {
        System.out.println("clean " + gym);
    }
 
    public void getTowel(Guest guest, int numberOfTowel) {
        System.out.println(numberOfTowel + " towels to " + guest);
    }
 
    public void clean(Restaurant restaurant) {
        System.out.println("clean " + restaurant);
    }
}
public class Restaurant {
 
    private CleaningService cleaningService = new CleaningService();
    public void dinner(Guest guest) {
        System.out.println("dinner " + guest);
    }
 
    public void clean() {
        cleaningService.clean(this);
    }
}
public class Gym {
 
    private CleaningService cleaningService;
 
    public void clean() {
        cleaningService.clean(this);
    }
}
public class Guest {
 
    private Restaurant restaurant = new Restaurant();
 
    private CleaningService cleaningService = new CleaningService();
 
    public void dinner() {
        restaurant.dinner(this);
    }
 
    public void getTower(int numberOfTowel) {
        cleaningService.getTowel(this, numberOfTowel);
    }
 
}
public class Hotel {
 
    public static void main(String[] args) {
        Guest guest = new Guest();
        guest.getTowel(3);
        guest.dinner();
 
        Restaurant restaurant = new Restaurant();
        restaurant.clean();
    }
}

문제점

- 각 클래스들을 보면 서로 의존관계를 가지고 있다

- Guest가 다양한 서비스에 대해서 구체적으로 알아야하는 문제점

중재자패턴 적용 후

//Mediator
public class FrontDesk {
 
    private CleaningService cleaningService = new CleaningService();
 
    private Restaurant restaurant = new Restaurant();
 
    public void getTowers(Guest guest, int numberOfTowers) {
        cleaningService.getTowers(guest.getId(), numberOfTowers);
    }
 
    public String getRoomNumberFor(Integer guestId) {
        return "room number";
    }
 
    public void dinner(Guest guest, LocalDateTime dateTime) {
        restaurant.dinner(guest.getId(), dateTime);
    }
}
//Collegue
public class CleaningService {
 
    private FrontDesk frontDesk = new FrontDesk();
 
    public void getTowers(Integer guestId, int numberOfTowers) {
        String roomNumber = this.frontDesk.getRoomNumberFor(guestId);
        System.out.println("provide " + numberOfTowers + " to " + roomNumber);
    }
}
//Collegue
public class Guest {
 
    @Getter @Setter private Integer id;
 
    private FrontDesk frontDesk = new FrontDesk();
 
    public void getTowers(int numberOfTowers) {
        this.frontDesk.getTowers(this, numberOfTowers);
    }
 
    private void dinner(LocalDateTime dateTime) {
        this.frontDesk.dinner(this, dateTime);
    }

}

특징

- 사용자는 중재자를 통해서 요청을 하므로써 의존성이 낮아졌다.

- 하지만 중재자부분은 의존성이 높아지는 문제점이 있다.

장점

- 컴포넌트 코드를 변경하지 않고, 새로운 중재자를 만들어 사용할 수 있다.

- 각각의 컴포넌트 코드를 보다 간결하게 유지할 수 있다

단점

- 중재자역할을 하는 클래스의 복잡도와 결합도가 증가한다. 의존성이 한곳으로 몰린다.

실무사용예

Java

- ExcutorService, Executor

스프링

- DispatcherService

728x90

'이론 > GoF' 카테고리의 다른 글

[행동패턴] 비지터 패턴  (0) 2023.08.22
[행동패턴] 메멘토 패턴  (0) 2023.08.21
[행동패턴] 이터레이터 패턴  (0) 2023.08.16
[행동패턴] 인터프리터 패턴  (0) 2023.08.15
[행동패턴] 커맨드 패턴  (0) 2023.08.13