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

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

Q. 위임 받는 Delegator가 해야 할 일은?
- 각 과목 선생님들의 수업을 진행할 수 있도록 Teacher 리스트 추가
- 리스트에 각 과목 선생님들 추가 (커리큘럼 추가)
- 해당 수업에 맞는 과목인지 확인한 후 해당 과목 선생님의 수업 진행을 할 수 있도록 delegate 함수 호출
- 강의 과목을 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