
interface LogWriter {
public function write(string $message): bool;
}
interface LogReader {
public function read(): array;
}
// 文件日志实现
class FileLogWriter implements LogWriter {
public function write(string $message): bool {
return file_put_contents('log.txt', $message . "\n", FILE_APPEND) !== false;
}
}
class FileLogReader implements LogReader {
public function read(): array {
return file('log.txt') ?: [];
}
}
// 数据库日志实现
class DbLogWriter implements LogWriter {
public function write(string $message): bool {
// 数据库写入逻辑
return true;
}
}
class DbLogReader implements LogReader {
public function read(): array {
// 数据库查询逻辑
return ['log1', 'log2'];
}
}
interface LogFactory {
public function getWriter(): LogWriter;
public function getReader(): LogReader;
}
class FileLogFactory implements LogFactory {
public function getWriter(): LogWriter {
return new FileLogWriter();
}
public function getReader(): LogReader {
return new FileLogReader();
}
}
class DbLogFactory implements LogFactory {
public function getWriter(): LogWriter {
return new DbLogWriter();
}
public function getReader(): LogReader {
return new DbLogReader();
}
}
// 切换日志类型只需修改工厂类
$factory = new FileLogFactory();
$factory->getWriter()->write('用户登录成功');
print_r($factory->getReader()->read());
abstract class DataImporter {
// 模板方法:定义固定流程
public final function import(string $file): bool {
if (!$this->validateFile($file)) {
return false;
}
$data = $this->parseFile($file);
return $this->saveData($data);
}
// 公共实现
private function validateFile(string $file): bool {
return file_exists($file) && is_readable($file);
}
// 抽象方法:留给子类实现
abstract protected function parseFile(string $file): array;
abstract protected function saveData(array $data): bool;
}
// CSV导入实现
class CsvImporter extends DataImporter {
protected function parseFile(string $file): array {
$handle = fopen($file, 'r');
$data = [];
while (($row = fgetcsv($handle)) !== false) {
$data[] = $row;
}
fclose($handle);
return $data;
}
protected function saveData(array $data): bool {
// 保存CSV数据逻辑
return true;
}
}
$importer = new CsvImporter();
$importer->import('data.csv'); // 自动执行完整流程