티스토리 뷰

디자인 패턴

17. 중재자 패턴

jin-park 2022. 2. 10. 21:04

1. 중재자 패턴

  • 여러 객체들이 소통하는 방법을 캡슐화하는 패턴
    • 여러 컴포넌트간의 결합도를 중재자를 통해 낮출 수 있다.

다이어그램

2. 중재자 패턴 적용

2.1. 적용 전 코드

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

2.2. 적용 후 코드

  • 중재자역할 클래스(FrontDesk)
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);
    }
}
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);
    }
}
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);
    }

}

3. 장점 및 단점

3.1. 장점

  • 컴포넌트 코드를 변경하지 않고 새로운 중재자를 만들어 사용할 수 있다.
  • 각각의 컴포넌트 코드를 보다 간결하게 유지할 수 있다.

3.2. 단점

  • 중재자 역할을 하는 클래스의 복잡도와 결합도가 증가한다

위글은 인프런의 코딩으로 학습하는 GoF의 디자인 패턴강의를 정리하였습니다.

백기선님의 수락으로 정리하였으며 더 자세한 내용은 강의를 수강하시기 바랍니다.

https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

'디자인 패턴' 카테고리의 다른 글

19. 옵저버 패턴  (0) 2022.02.11
18. 메멘토 패턴  (0) 2022.02.10
16. 이터레이터 패턴  (0) 2022.02.10
15. 인터프리터 패턴  (0) 2022.02.10
14. 커맨드 패턴  (0) 2022.02.10
댓글