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 |