일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- iot
- Adapter
- designpattern
- state
- EventLoop
- philipshue
- factory
- network
- OpenAI
- SampleApp
- LifeCycle
- SwiftUI
- Xcode
- Architecture
- dart
- dartz
- builder
- swift
- uikit
- WWDC24
- isolate
- tuist
- 문법
- singleton
- concurrency
- WiFi
- weatherkit
- GIT
- AppleDeveloper
- flutter
Archives
- Today
- Total
Jaebi의 Binary는 호남선
Behavioral Patterns - Template 본문
목차
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 |