BehavioralPattern_10.Template Method

Oct 11th 2020 by jyoon

def

  • 템플릿 방법 패턴은 알고리즘에 대한 일련의 단계 개요를 ​제공한다.
  • 이러한 단계를 구현하는 객체는 알고리즘의 원래 구조를 유지하지만 특정 단계를 재정의하거나 조정할 수있는 옵션이 있다.
  • 이 패턴은 클라이언트 개발자에게 확장성을 제공하도록 설계되어 있다.
  • 템플릿 메서드는 다른 개발자가 사용할 범용 프레임 워크 또는 라이브러리에서 자주 사용된다.
  • 예제는 프로세스 요청과 같은 작업에 대한 응답으로 일련의 이벤트를 발생시키는 객체이다.
  • 객체는 '전처리'이벤트, '프로세스'이벤트 및 '후 처리'이벤트를 생성한다.
  • 개발자는 처리 직전, 처리 중 및 처리 직후에 응답을 조정할 수있는 옵션이 있다.
  • 템플릿 방법을 쉽게 생각할 수있는 방법은 구멍이있는 알고리즘이다. (아래 다이어그램 참조).
  • 각 단계에 적절한 기능으로 이러한 구멍을 채우는 것은 개발자의 몫이다.

participants

  • AbstractClass

    • [POINT1]

      - 클라이언트가 templateMethod를 호출할 수 있는 인터페이스를 제공(process 함수)
      - 알고리즘의 기본 단계를 정의하는 템플릿 방법을 구현
    • [POINT2]

      - 클라이언트 개발자가 구현할 수 있는 hooks(method 재정의를 통해서)를 제공
      : run 함수에서 mySql객체가 인터페이스 내에서 수행되는 method를(connect, select, disconnect) 재정의한다.
    • code: datastore
  • ConcreteClass

    • AbstractClass에 정의 된 기본 단계를 구현한다.
    • code: mySql

Sample Code 설명

  • 여기에 JavaScript의 프로토타입 상속을 사용하는 예가 있다.
  • 상속 기능은 새로 생성 된 하위 객체의 프로토타입에 기본객체를 할당하여 상속 관계를 설정하는데 도움이 된다.
  • 데이터 저장소 함수는 AbstractClass를 나타내고 mySql은 ConcreteClass를 나타낸다.
  • mySql은 데이터 스토어 별 구현으로 연결, 선택 및 연결 해제의 세 가지 템플릿 메서드를 재정의한다.
  • 템플릿 메서드를 사용하면 클라이언트가 템플릿 메서드만(connect, select, disconnect) 작성하여 데이터 저장소 (SQL Server, Oracle 등)를 변경할 수 있다.
  • 단계 순서와 같은 나머지는 모든 데이터 스토어에서 동일하게 유지된다. datastore.process를 상속받은 객체가 "connect, select, disconnect" 이 세개 function을 정의 하지 않으면 error가 난다.

CODE

var log = (function () {
  var log = '';

  return {
    add: function (msg) { log += msg + '\n' },
    show: function () { console.log(log); log = ''; }
  }
})();

// AbstractClass 역할
var datastore = {
  // [POINT1]
  // 상속 대상(프로토타입에 할당)
  process: function () {
    try {
      //[POINT2]
      this.connect();
      this.select();
      this.disconnect();
    } catch (error) {
      console.log(error)
    }
    return this;
  },
}

function inherit(proto) {
  var F = function () { };
  // 상속 하기 위해서는 prototype에 dictionary 객체를 할당하면 된다.
  F.prototype = proto;
  return new F();
}

function run() {
  // ConcreteClass 역할
  // mySql: F{}
  // mySql.__proto__: {process: f}
  var mySql = inherit(datastore);

  // implement template steps
  mySql.connect = function () {
    log.add("MySQL: connect step");
  }
  mySql.select = function () {
    log.add("MySQL: select step");
  }
  mySql.disconnect = function () {
    log.add("MySQL: disconnect step");
  }

  // mySql: F{connect: f, select: f, disconnect: f}

  mySql.process();
  log.show();
}

run();