PHP でデザインパターン (Facade)
PHP デザインパターン
Published: 2018-09-29

Facade の目的

Facade 役は、システムの外側に対してはシンプルなインターフェース( API )を見せます。 また、Facade 役はシステムの内側にある各クラスの役割や依存関係を考えて、正しい順番でクラスを利用します。

Facade のメリット

  • サブシステムの構成要素を隠蔽する
  • サブシステムとクライアントの結びつきをゆるくする

実装例

<?php

class ArrDatabase
{
    private function __construct()
    {
    }

    public static function getProperties()
    {
        return [
            'abc@xxx' => 'abc ABC',
            'def@xxx' => 'def DEF',
            'xyz@xxx' => 'xyz XYZ',
        ];
    }
}

class HtmlWriter
{
    private $writer;

    public function __construct($writer)
    {
        $this->writer = $writer;
    }

    public function title($title)
    {
        $this->writer->open();
        $this->writer->write("title始まり\n");
        $this->writer->write($title . "\n");
        $this->writer->write("title終わり\n");
    }

    public function paragraph($message)
    {
        $this->writer->write("paragraph始まり\n");
        $this->writer->write($message . "\n");
        $this->writer->write("paragraph終わり\n");
    }

    public function close()
    {
        $this->writer->close();
    }
}

/*
 * ファイルの書き出す
 *
 */
class FileWriter
{
    private $filename;
    private $file_handler;

    public function __construct($filename)
    {
        $this->filename = $filename;
    }

    public function open()
    {
        $this->file_hanlder = fopen($this->filename, 'w');
    }

    public function write($content)
    {
        fwrite($this->file_hanlder, $content);
    }

    public function close()
    {
        return fclose($this->file_hanlder);
    }
}

class PageMaker
{
    private function __construct()
    {
    }

    public static function makeWelcomePage($mailaddr, $filename)
    {
        $mailprop = ArrDatabase::getProperties();
        $username = $mailprop[$mailaddr];

        $writer = new HtmlWriter(new FileWriter($filename));
        $writer->title("Welcome to " . $username . "'s page!");
        $writer->paragraph($username . "のページへようこそ");
    }
}

PageMaker::makeWelcomePage('xyz@xxx', '/tmp/welcome.html');

参考