Facade パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の Chain of Responsibilityからの続き。

Facade(ファサード)とは「建物の正面」を意味する。異なるサブシステムを単純な操作だけを持った Facade クラスで結び、サブシステム間の独立性を高める事を目的とする。

クラス図

Facade PlantUML

自分としての理解・疑問

  • 利用側からは特定の条件だけを指定して実際の処理は下層の処理が引き受ける
  • この例だと pageMaker 側が処理を一手に引き受けている
  • デザインパターンというよりどこで苦労するか?みたいな印象
  • 利用側自体のパターンが多い場合、もしくは利用側が多い場合などはこういう形の方が後々は良さそう

↓ メインの main.php からはこれだけの処理なので、綺麗に見えるけど…。

<?php

require_once __DIR__ . "/PageMaker.php";
\Facade\PageMaker::makeWelcomePage("fooo@example.com", "welcome.html");

それを渡された makeWelcomPage 側は下記のようなゴチャっとした感じが出てしまうので、どこが纏めるのかっていう感じはする。

<?php
        try {
            $mailprop = \Facade\Database::getProperties('maildata');
            $username = $mailprop[$mailaddr];
            $write = new \Facade\HtmlWriter(new \SplFileObject($filename, 'w+'));
            $write->title("Welcome to {$username}'s page!");
            $write->paragraph("{$username}のページへようこそ");
            $write->paragraph("メール待ってますね");
            $write->mailto($mailaddr, $username);
            $write->close();
            echo "{$filename} is created for {$mailaddr} ({$username})";
        } catch (Exception $e) {
            echo '捕捉した例外: ' . $e->getMessage() . PHP_EOL;
        }

Java の Properties クラス

Java の Properties クラスのようなものが PHP にはないので、結局テキストファイルを入れるという処理で代替してる。若干ダサいけどこれはこれでいいやと。