絶版されているけれど、Google booksで公開されているのが見れます。
https://books.google.co.jp/books?id=sXNh4TeQeBIC&printsec=frontcover&hl=ja#v=onepage&q&f=false
1日1パターンってことで演習してアウトプットしていきます。
もくじ
使いどころ
- 十分に実績のあるクラスを変更せずにAPIとして利用したい場合
実装のポイント
- 十分実績のあるクラスを利用する為に、Adapterとなるクラスを作成する。クライアントはインターフェイスを通してAdapterにアクセスして、Adapterは十分実績のあるクラスを継承する
Adapterのメリット
- クライアントはインターフェイスとだけアクセスする、内部の実装を意識しなくて良い
index.php
<?php require_once 'DisplaySourceFileImpl.class.php'; /** * DisplaySourceFileImplクラスをインスタンス化する * 内容を表示するファイルは、[ShowFile.class.php] */ $show_file = new DisplaySourceFileImpl('./ShowFile.class.php'); /** * プレーンテキストとハイライトしたファイル内容をそれぞれ表示する */ $show_file->display();
DisplaySourceFile.class.php
<?php interface DisplaySourceFile { /** * 指定されたソースファイルをハイライト表示する */ public function display(); }
DisplaySourceFileImpl.class.php
<?php require_once 'DisplaySourceFile.class.php'; require_once 'ShowFile.class.php'; /** * DisplaySourceFileを実装したクラス */ class DisplaySourceFileImpl extends ShowFile implements DisplaySourceFile { /** * コンストラクタ */ public function __construct($filename) { parent::__construct($filename); } /** * 指定されたソースファイルをハイライト表示する */ public function display() { parent::showHighlight(); } }
ShowFile.class.php
<?php /** * 指定されたファイルの内容を表示するクラス */ class ShowFile { /** * 指定されたファイルの内容を表示するクラス * * @access private */ private $filename; /** * コンストラクタ * * @param sring ファイル名 * @throws Exception */ public function __construct($filename) { if(!is_readable($filename)) { throw new Exception('file "' . $filename . '" is not readable!'); } $this->filename = $filename; } /** * プレーンテキストとして表示する */ public function showPlain() { echo '<pre>'; echo htmlspecialchars(file_get_contents($this->filename), ENT_QUOTES); echo '</pre>'; } /** * キーワードをハイライトで表示する */ public function showHighlight() { highlight_file($this->filename); } }
/demo/Design-Pattern-Primer-by-PHP/Adapter/