inblog logo
|
sxias
    디자인패턴

    [디자인패턴] 9. Delegate Pattern

    문정준's avatar
    문정준
    Jul 23, 2025
    [디자인패턴] 9. Delegate Pattern
    Contents
    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
    Contents
    Delegate Pattern

    Sxias ㆍ a32176740@gmail.com

    RSS·Powered by Inblog