メインコンテンツまでスキップ

🧩 Facade × Iterator

✅ 組み合わせの意図

  • Iterator で一連の処理(タスク)を走査し、
  • Facade によってそれらを簡潔な操作として外部に提供する

「複数のステップ処理」が必要な場合でも、Facade を使えば呼び出し側は registerUser() のような 1 行だけで済む。 内部では Iterator によって、各ステップ(ログ・通知など)を順番に処理している。

✅ よく使われるシーン

  • 登録処理や初期化処理など、一連のステップをまとめて実行したいとき
  • ステップの構造は保ちつつ、利用者側のコードを簡素化したいとき
  • ログ、通知、バリデーションなど、繰り返し処理を 1 つの流れで扱いたいとき

✅ UML クラス図

✅ コード例

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");

✅ 解説

  • Task インターフェースは、各ステップ処理の共通化された契約
  • TaskExecutorIterator の役割を果たし、タスクを順に実行
  • UserRegistrationFacade はこれらをまとめ、呼び出し側がシンプルなインターフェースで使えるようにする

このように、ステップごとの処理は疎結合で管理しつつ、利用者には簡単な窓口(Facade)を提供することで、 柔軟性と使いやすさの両立が実現できる。

✅ まとめ

  • Facade により、一連の処理を 1 メソッドで簡潔に実行可能
  • Iterator により、複数の処理ステップを順番に実行できる構造を実現
  • ステップの追加・削除がしやすく、処理全体の見通しも良くなる