[디자인패턴] 9. Delegate Pattern

문정준's avatar
Jul 23, 2025
[디자인패턴] 9. Delegate Pattern

Delegate Pattern

  • 객체가 가진 책임을 위임하는 패턴
 

Delegator vs Proxy

  • Delegator와 Proxy 모두 객체의 책임을 대신 받는 구조
  • Proxy의 경우 하나의 로직에 포함되는 부가적 책임들을 위임받아 동작
    • 접근 제어, 로깅, 캐싱 등
  • Delegator는 해당 객체가 가질 수 있는 다른 책임들을 해당 객체와 분리하기 위해 위임받음
    • 해당 객체에 포함되는 추가 기능 중 어느 것이든 가능 (기능별로 분리)
    • 원래 객체의 책임 분리 (SRP)
 
notion image

Ex. 수업 듣기

  • 수업을 총 3과목을 들을 것임
    • 역사, 수학, 과학
  • 선생님 혼자서 3과목을 전부 다 알려줄 수 없음 : 각 과목을 담당하는 선생님들에게 책임 위임
notion image

Q. 위임 받는 Delegator가 해야 할 일은?

  1. 각 과목 선생님들의 수업을 진행할 수 있도록 Teacher 리스트 추가
    1. 리스트에 각 과목 선생님들 추가 (커리큘럼 추가)
  1. 해당 수업에 맞는 과목인지 확인한 후 해당 과목 선생님의 수업 진행을 할 수 있도록 delegate 함수 호출
    1. 강의 과목을 String 또는 Enum 등으로 지정
 
  • App.java
public class App { public static void main(String[] args) { // MathTeacher mt = new MathTeacher(); // mt.doLecture(); // // HistoryTeacher ht = new HistoryTeacher(); // ht.doLecture(); LectureDelagator ld = new LectureDelagator(); // 직접 Teacher를 호출하지 않고 Delegator가 대신 수행 ld.delegate(LectureType.MATH); ld.delegate(LectureType.HISTORY); ld.delegate(LectureType.SCIENCE); } }
 
  • Teacher.java
public interface Teacher { void doLecture(); boolean isSameLecture(LectureType lectureType); }
 
  • LectureType.java
public enum LectureType { MATH, SCIENCE, HISTORY; }
 
  • MathTeacher.java
public class MathTeacher implements Teacher { public void doLecture() { System.out.println("수학 강의를 시작합니다"); } @Override public boolean isSameLecture(LectureType lectureType) { return LectureType.MATH.equals(lectureType); } }
 
  • ScienceTeacher.java
public class ScienceTeacher implements Teacher { public void doLecture() { System.out.println("과학 강의를 시작합니다"); } @Override public boolean isSameLecture(LectureType lectureType) { return LectureType.SCIENCE.equals(lectureType); } }
 
  • HistoryTeacher.java
public class HistoryTeacher implements Teacher { public void doLecture() { System.out.println("역사 강의를 시작합니다"); } @Override public boolean isSameLecture(LectureType lectureType) { return LectureType.HISTORY.equals(lectureType); } }
 
  • LectureDelegator.java
    • stream 또는 foreach로 구현 가능
public class LectureDelagator { private List<Teacher> teachers = new ArrayList<>(); public LectureDelagator() { teachers.add(new HistoryTeacher()); teachers.add(new MathTeacher()); teachers.add(new ScienceTeacher()); } // Stream public void delegate(LectureType lectureType) { teachers.stream() .filter(teacher -> teacher.isSameLecture(lectureType)) .forEach(teacher -> teacher.doLecture()); } // forEach public void delegate2(LectureType lectureType) { for (Teacher teacher : teachers) { if (teacher.isSameLecture(lectureType)) { teacher.doLecture(); } } } }
Share article

sxias