Defines the skeleton of an algorithm in a base class, letting subclasses override specific steps.
The structure stays the same, but the details vary.
abstract class DataMiner {
// template method
void mine(String path) {
final raw = extractData(path);
final parsed = parseData(raw);
analyze(parsed);
}
String extractData(String path); // subclass provides
List<String> parseData(String raw); // subclass provides
void analyze(List<String> data) {
print('Analyzing ${data.length} records');
}
}
class CsvMiner extends DataMiner {
@override
String extractData(String path) => 'csv,raw,data';
@override
List<String> parseData(String raw) => raw.split(',');
}
// Usage
CsvMiner().mine('data.csv'); // Analyzing 3 records