Delegate는 사전적 의미로 "위임"의 뜻을 가지고 있다.
대리인은 우리와 다른 사람임에도 결정 권한이라는 행동에 대해 우리와 똑같이 행동할 수 있게 되는 것이다.
즉, 원래 본인이 해야할 작업을 다른 객체에게 자신의 일을 위임하는 패턴이 델리게이트 패턴인 것이다.
Worker.java
public class Worker{ private String name; Person(String name) { this.name = name; } void 본업() { 일에관한 코드 일에관한 코드 일에관한 코드 일에관한 코드 일에관한 코드 } void 전세 대출() { 대출되는 은행 탐방 - ... } void 부동산 돌기() { 부동산 10곳 찾기 ... } void 계약 하기() { 계약서 꼼꼼히 검토 ... } }
나 뿐만 아니라 나와 동일한 처지의 친구도 본업만 다를 뿐이지 방을 구하기 위해 필요한 행위는 같은 것이다.
그렇다면 방 계약만을 따로 도와줄 수 있는 위임자가 있다면 그 분에게 나와 친구의 방 계약을 맡긴다면 효율적 일것이다.
RommGetter라는 인터페이스를 만들어보는 것으로 시작.
인터페이스에는 방을 구하는 사람이 해야하는 일을 선언.
그리고 RommGetter라는 인터페이스를 구현하는 FirstRoomGetter 클래스를 구현
RoomGetter
poublic interface RommGetter { void 전세 대출(); void 부동산 돌기(); void 계약하기(); }
Worker는 방계약과 관련된 코드를 직접 수행하지 않고 RoomGetter 타입을 가진 Delegate 객체에게 시키면 된다.
Worker.java
public class Worker { private String name; private RoomGetter delegate; Person(String name) { this.name = name; } void 본업() { 일에관한 코드 일에관한 코드 일에관한 코드 일에관한 코드 일에관한 코드 } void 방 계약() { delegate.전세 대출(); delegate.부동산 돌기(); delegate.계약하기(); } }
RoomGetter를 구현하는 FirstRoomGetter라는 클래스를 구현.
생성할 때 Worker를 인자로 받아 인자에 자기 자신을 등록.
그리고 실제 방을 계약하기 위해 필요한 함수를 구현.
FirstRoomGetter.java
public class FirstRoomGetter implements RoomGetter { FirstRoomGetter(Worker: worker){ worker.delegate = this; } void 전세 대출() { 대출되는 은행 탐밤 - ... } void 부동산 돌기() { 부동산 10곳 찾기 ... } void 계약 하기() { 계약서 꼼꼼히 검토 ... } }
사용시
Worker me = new Worker(); RoomGetter roomGetter = new FirstRoomGetter(me); me.방 계약();
Main class가 실행되면 Print 객체의 print() 메서드가 실행되지만 실제 구현으로 보면 Print 객체가 하는 것이 아니라 Print 객체의 print()메서드가 RealPrinter의 print() 메서드를 호출하여 일을 위임하고 있다.
RealPrinter.java ---> delegate
class RealPrinter { void print() { System.out.print("Something"); } }
Printer.java ---> delegator
class Printer { RealPrinter p = new RealPrinter(); // delegate(위임자) 생성 void print() { p.print(); // delegation } }
Main.java
public class Main { public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
interface I {
void f();
void g();
}
class A implements I {
public void f() { System.out.println("A: doing f()"); }
public void g() { System.out.println("A: doing g()"); }
}
class B implements I {
public void f() { System.out.println("B: doing f()"); }
public void g() { System.out.println("B: doing g()"); }
}
class C implements I {
// delefation
I i = new A();
public void f() { i.f(); }
public void g() { i.g(); }
// normal attribute
public void toA() { i = new A(); }
public void toB() { i = new B(); }
}
public class Main {
public static void main(String[] args) {
C c = new C();
c.f(); //o output: A: doing f()
c.g(); //o output: A: doing g()
c.toB();
c.f(); //o output: B: doing f()
c.g(); //o output: B: doing g()