PHP>デザインパターン-PHPでTemplateMethodの入門

デザインパターン-PHPでTemplateMethodの入門

2018年6月12日

デザインパターンとはオブジェクト指向を理解するために最高の設計方法です。

オブジェクト指向を知っているからデザインパターンが使えるのではなく、オブジェクト指向を理解するためにデザインパターンを勉強するという意見もあります。

 

今回は中でも使用頻度の高いTemplateMethodを実装していきます。

 

 

今回のコードはGitHubにも掲載しています。

 

今回の方針

TemplateMethodについての考えについては深く触れずに、どのようなものか作ったものを紹介していきます。

処理の流れを定義しておいて、具体的な処理の内容についてはサブクラスに任せる。というのがこのTemplateMethodの肝になります。

抽象クラスと抽象メソッドをうまく利用したデザインパターンです。

 

今回は、クライアントがSQLを実行する想定です。
クライアントはSQLしか用意していません。

OracleにしろMySQLにしろ、クライアントは詳しい操作をする必要もなく、利用できるようにします。

MySQLのほうに関しては実装していきますが、私はOracleの環境がないのでOracleのほうは超雑ですが、考え方は間違っていないと思います。

 

 

TemplateMethodの実装

それでは実装していきます。

まずは基礎となる抽象クラスを定義していきます。

 

Template.php

ここには実装済みのメソッドと、抽象メソッドが定義されています。

ExecuteQueryメソッドでは、抽象クラスを順番に呼び出しているのですが、3つの抽象クラスに関してはサブクラスが実装することになります。

 

では早速作っていきます。

まずは雑に作ったoracle側で見ていきます。

 

OracleTemplate.php

 

先ほどの抽象クラスを継承し、定義してあった抽象メソッドを実装していきます。

具体的な処理の内容はサブクラスに任せるというのは、こういうことです。

 

dbに接続し、sqlを実行し、dbから切断する

 

という一連の処理を予め定義しておき、具体的な処理内容についてはサブクラス側で実装させるというのがポイントです。

これを実際に使用するクライアントを実装します

Client.php

 

まだ定義していないMysqlTemplateも出てきていますが

 

$oracle = new OracleTemplate();
$oracle->ExecuteQuery(“oracle”);

 

というコードだけで、DBに接続しSQLを実行しDBから切断するという処理が動くのです。

クライアントは具体的な処理内容について何も知らずとも、SQLを実行することができます

 

 

では、MysqlTemplateも実装していきますが、考え方はOracleTemplateと全く同じです

 

MysqlTemplate.php

 

接続してSQLを実行して切断するという、一連の流れを定義しています。

この複雑な処理も

 

$mysql = new MysqlTemplate();

$mysql->ExecuteQuery(“UPDATE comment SET comment = ‘コメントを変更します’ WHERE comment.id = 1″);

 

と打つだけで動いているのです。

 

 

内部の仕組みを完全に隠蔽しています。

 

ちなみに実行結果がこんな感じです

 

 

クライアントは少ないコードでSQLを利用できましたとさ!