Jaebi의 Binary는 호남선

Behavioral Patterns - Template 본문

공부

Behavioral Patterns - Template

jaebijae 2024. 6. 1. 20:00

목차

    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