Jaebi의 Binary는 호남선

Behavioral Patterns - Template 본문

공부

Behavioral Patterns - Template

jaebijae 2024. 6. 1. 20:00

목차 Open

Template

  • 알고리즘의 뼈대만의 정의 하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미룸
  • 알고리즘의 구조 차체는 변화 없이 각 단계 처리를 서브클래스 에서 재정의 할 수 있게 함
  • 거의 모든 추상 클래스에서 사용할 정도로 필수적이고 기본적인 패턴 → 코드 재사용의 기본 기술
  • 동기: 예시로 3단계의 동작을 하는 알고리즘 (데이터 소스에서 read, process, provide result) → 3rd party API를 통해 데이터를 받아와 console에 띄우는 경우가 있을 수 있고, local disk에서 데이터를 읽어 email로 보내는 경우가 있을수 있음 → 둘 다 같은 동작의 알고리즘 (3단계)을 사용함 → Template Method Pattern을 통해 해당 기능 적용
  • 활용성:
    • 어떤 한 알고리즘을 이루는 부분 중 변하지 않는 부분을 한 번 정의해 놓고 다양해질 수 있는 부분은 서브클래스에서 정의할 수 있도록 남겨두고자 할 때
    • 서브클래스 사이의 공통적인 행동을 추출하여 하나의 공통 클래스에 몰아둠으로써 코드 중복을 피하고 싶을 때
    • 서브클래스의 확장을 제어 할 시

  • 구조:
    • AbstractClass: 서브클래스들이 재정의를 통해 구현해야 하는 알고리즘 처리 단계 내의 기본 연산을 정의
    • ConcreteClass: 서브클래스마다 달라진 알고리즘 처리 단계를 수행하기 위한 기본 연산을 구현
  • 장점:
    • 코드 중복 감소
    • 자식 클래스의 역할을 감소 시키면서 핵심 로직 관리
    • 객체 추가 및 확장 쉽게 가능
void main() {
  var miner1 = ThirdPartyDataMiner();
  var miner2 = LocalDataMiner();
  miner1.templateMethod();
  print('\n');
  miner2.templateMethod();
}
abstract class DataMiner {
  // template method defines skeleton of an algorithm
  void templateMethod() {
    readData();
    formatData();
    processData();
    sendData();
  }
  // operations that need to be implemented in subclass
  void readData();
  void formatData();
  void sendData();
  // operation that already have implementation and is common
  void processData() {
    print('process the formatted data, commonly used');
  }
}
class ThirdPartyDataMiner extends DataMiner {
  @override
  void readData() {
    print('read data from third party');
  }
  @override
  void formatData() {
    print('format data to appropriate format from the data');
  }
  @override
  void sendData() {
    print('send data to console');
  }
}
class LocalDataMiner extends DataMiner {
  @override
  void readData() {
    print('read data from a file');
  }
  @override
  void formatData() {
    print('format data to appropriate format from the data');
  }
  @override
  void sendData() {
    print('send data via email');
  }
}
 

 

'공부' 카테고리의 다른 글

TDD - Test Driven Development  (0) 2024.06.01
Flutter - Isolate & Event Loop  (0) 2024.06.01
Behavioral Patterns - Adapter  (0) 2024.06.01
Structural Patterns - Adapter  (0) 2024.06.01
Creational Patterns - Factory Method  (0) 2024.06.01