laravel-template-method-and-plugins
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTemplate Method and Pluggable Strategies
Template Method与可插拔策略模式
Keep core flows stable; enable extension via small classes.
保持核心流程稳定;通过小型类实现扩展。
Template Method
Template Method
Use a base class that defines the algorithm skeleton; subclasses override hooks.
php
abstract class Importer {
final public function handle(string $path): void {
$rows = $this->load($path);
$data = $this->normalize($rows);
$this->validate($data);
$this->save($data);
}
abstract protected function load(string $path): array;
protected function normalize(array $rows): array { return $rows; }
protected function validate(array $data): void {}
abstract protected function save(array $data): void;
}使用定义算法骨架的基类;子类重写钩子方法。
php
abstract class Importer {
final public function handle(string $path): void {
$rows = $this->load($path);
$data = $this->normalize($rows);
$this->validate($data);
$this->save($data);
}
abstract protected function load(string $path): array;
protected function normalize(array $rows): array { return $rows; }
protected function validate(array $data): void {}
abstract protected function save(array $data): void;
}Strategy/Plugin
Strategy/Plugin
Define an interface; register implementations; select by key/config.
php
interface PaymentGateway { public function charge(int $cents, string $currency): string; }
final class StripeGateway implements PaymentGateway { /* ... */ }
final class BraintreeGateway implements PaymentGateway { /* ... */ }
final class PaymentsRegistry {
/** @param array<string,PaymentGateway> $drivers */
public function __construct(private array $drivers) {}
public function for(string $key): PaymentGateway { return $this->drivers[$key]; }
}Prefer adding a class over editing switch statements. Test implementations in isolation.
定义接口;注册实现类;通过键值/配置选择。
php
interface PaymentGateway { public function charge(int $cents, string $currency): string; }
final class StripeGateway implements PaymentGateway { /* ... */ }
final class BraintreeGateway implements PaymentGateway { /* ... */ }
final class PaymentsRegistry {
/** @param array<string,PaymentGateway> $drivers */
public function __construct(private array $drivers) {}
public function for(string $key): PaymentGateway { return $this->drivers[$key]; }
}优先新增类而非修改switch语句。独立测试各实现类。