🧩 Facade × Iterator
✅ 組み合わせの意図
Iterator
で一連の処理(タスク)を走査し、Facade
によってそれらを簡潔な操作として外部に提供する
「複数のステップ処理」が必要な場合でも、Facade
を使えば呼び出し側は registerUser()
のような 1 行だけで済む。
内部では Iterator
によって、各ステップ(ログ・通知など)を順番に処理している。
✅ よく使われるシーン
- 登録処理や初期化処理など、一連のステップをまとめて実行したいとき
- ステップの構造は保ちつつ、利用者側のコードを簡素化したいとき
- ログ、通知、バリデーションなど、繰り返し処理を 1 つの流れで扱いたいとき
✅ UML クラス図
✅ コード例
- TypeScript
- PHP
- Python
interface Task {
execute(): void;
}
class LogTask implements Task {
constructor(private message: string) {}
execute(): void {
console.log(`[Log]: ${this.message}`);
}
}
class EmailTask implements Task {
constructor(private recipient: string, private content: string) {}
execute(): void {
console.log(`[Email]: To ${this.recipient} - ${this.content}`);
}
}
class TaskExecutor {
constructor(private tasks: Task[]) {}
runAll(): void {
for (const task of this.tasks) {
task.execute();
}
}
}
class UserRegistrationFacade {
registerUser(user: string): void {
const tasks: Task[] = [
new LogTask(`Registering user: ${user}`),
new EmailTask(user, "Welcome to our service!"),
new LogTask(`User registered successfully: ${user}`),
];
const executor = new TaskExecutor(tasks);
executor.runAll();
}
}
// 使用例
const facade = new UserRegistrationFacade();
facade.registerUser("taro@example.com");
<?php
interface Task {
public function execute(array &$context): void;
}
class LogTask implements Task {
public function execute(array &$context): void {
echo "[LOG] Registering user: " . $context['user'] . PHP_EOL;
}
}
class NotifyTask implements Task {
public function execute(array &$context): void {
echo "[NOTIFY] Welcome message sent to: " . $context['user'] . PHP_EOL;
}
}
class TaskExecutor {
/** @var Task[] */
private array $tasks = [];
public function addTask(Task $task): void {
$this->tasks[] = $task;
}
public function executeAll(array &$context): void {
foreach ($this->tasks as $task) {
$task->execute($context);
}
}
}
class UserRegistrationFacade {
private TaskExecutor $executor;
public function __construct() {
$this->executor = new TaskExecutor();
$this->executor->addTask(new LogTask());
$this->executor->addTask(new NotifyTask());
}
public function registerUser(string $user): void {
$context = ['user' => $user];
$this->executor->executeAll($context);
}
}
// 使用例
$facade = new UserRegistrationFacade();
$facade->registerUser("taro@example.com");
from abc import ABC, abstractmethod
class Task(ABC):
@abstractmethod
def execute(self, context: dict) -> None:
pass
class LogTask(Task):
def execute(self, context: dict) -> None:
print(f"[LOG] Registering user: {context['user']}")
class NotifyTask(Task):
def execute(self, context: dict) -> None:
print(f"[NOTIFY] Welcome message sent to: {context['user']}")
class TaskExecutor:
def __init__(self):
self.tasks: list[Task] = []
def add_task(self, task: Task) -> None:
self.tasks.append(task)
def execute_all(self, context: dict) -> None:
for task in self.tasks:
task.execute(context)
class UserRegistrationFacade:
def __init__(self):
self.executor = TaskExecutor()
self.executor.add_task(LogTask())
self.executor.add_task(NotifyTask())
def register_user(self, user: str) -> None:
context = {"user": user}
self.executor.execute_all(context)
# 使用例
facade = UserRegistrationFacade()
facade.register_user("taro@example.com")
✅ 解説
Task
インターフェースは、各ステップ処理の共通化された契約TaskExecutor
はIterator
の役割を果たし、タスクを順に実行UserRegistrationFacade
はこれらをまとめ、呼び出し側がシンプルなインターフェースで使えるようにする
このように、ステップごとの処理は疎結合で管理しつつ、利用者には簡単な窓口(Facade)を提供することで、 柔軟性と使いやすさの両立が実現できる。
✅ まとめ
- Facade により、一連の処理を 1 メソッドで簡潔に実行可能
- Iterator により、複数の処理ステップを順番に実行できる構造を実現
- ステップの追加・削除がしやすく、処理全体の見通しも良くなる