Базовый класс задает скелет алгоритма (шаги), подклассы переопределяют отдельные шаги.
abstract class DataImporter {
final public function import(string $path): void {
$data = $this->read($path);
$normalized = $this->normalize($data);
$this->persist($normalized);
}
abstract protected function read(string $path): array;
abstract protected function normalize(array $data): array;
protected function persist(array $data): void { /* default */ }
}Переиспользование общей логики без дублирования. Хук-методы - опциональные переопределяемые шаги.