프로그래밍/DesignPattern

템플릿/콜백 과 프록시 의 차이(?)

모지사바하 2013. 5. 16. 10:45
템플릿/콜백 과 프록시 가 왠지 겹친다..


 

템플릿/콜백 은

 

변하지 않는 템플릿을 정의하고 인자로 콜백을 갖는다.

 

class SomeTemplate

public void someWork(SomeCallback someCallback){

try{

   someCallback.callbackWork();

}catch(){}

}

 

대략 이런식이다..

 

그리고 클라이언트가 호출할 때 callBack을 직접 구현해서 넘겨준다.

class SomeClient

SomeTemplate someTemplate;

public void clientWork(){

  someTemplate.someWork(new SomeCallback(){

      public void someCallbackMethod(){

         do something work....

      }

   }

}

대략 이런식이다..

 

템플릿/콜백 은 고정된 내용을 템플릿화 하고, 변할 수 있는 내용인 콜백을 클라이언트가 템플릿을 호출하면서 다이렉트로 구현해서 넘겨준다. 개방폐쇄(OCP) 에 잘 들어맞는다..

 

이제 프록시를 살펴보자..

 

처음엔 프록시가 일종의 템플릿. 타깃이 일종의 콜백 처럼 보였다.

 

프록시 객체에 고정된 내용을 넣어놓고, DI로 타깃을 갖고 있다가, 작업을 타깃에 위임한다.

 

그런데 다시 생각해보니 완전 반대인것 같다.

 

프록시는 고정된 타깃에 변화할 수 있는 부가기능을 동적으로 추가하는 기법으로 쓰인다..

 

그러니 여기선 타깃이 오히려 템플릿 같고, 프록시가 콜백 같은 개념으로 보이니,, 템플릿 / 콜백과는 완전히 반대인 셈이다...

물론 프록시와 템플릿/콜백은 완전 다른 기법이나 ,,, 어떤 면에서 보면 꽤 비슷한거 같기도 하다.

클라이언트가 호출 할 때 프록시가 꼭 타깃인양 위장하고 있다가 호출당하면, 어떤 부가기능 속에서

(이를테면 try { }catch 같은..) 타깃에게 작업을 위임한다..

 

class Proxy implements SomeInterface{

   SomeInterface target;

   public void someWork(){

      try{

         target.someWork();

      }catch(....){

          ....

      }

   }

 

대충 위와 같은 식인 셈이다..

 

그리고 템플릿/콜백 은 메소드 단위로 발생하는 중복을 템플릿 화 하고 변화할 수 있는 내용을 콜백으로 받아서 처리 하는 기법이고,

 

프록시는 아예 객체 자체를 프록시를 대리로 세워서 바꿔치기 하는 기법이다.

완전 다른 기법이다..

 

머리로 혼란이 올 때는 이렇게 작성을 하면 생각이 정리되면서 해결이 되는군..

 

너무 당연하게만 생각해오던 템플릿/콜백 과 프록시의 유사성에 대해 갑작스레 혼란이 와서 정리차원에서 메모해둔다...