ホームページ >バックエンド開発 >PHPチュートリアル >コードはすべて「PHP デザイン パターン」という本からのものです。

コードはすべて「PHP デザイン パターン」という本からのものです。

WBOY
WBOYオリジナル
2016-07-25 09:08:46841ブラウズ
代案均来源《PHP设计モード》一书
  1. ?/**
  2. * 『PHP デザインパターン』第 6 章: デコレーター パターンより転載
  3. *
  4. * デコレーター デザイン パターンは、次のような職場に適しています: 要件の変更が迅速かつ小規模であり、アプリケーションの他の部分への影響がほとんどありません。 ()
  5. * デコレーター設計パターンを使用してクラスを設計する目的は、既存の関数コードを書き直すことなく、オブジェクトに増分変更を適用することです。
  6. * デコレーターのデザイン パターンは、他のコード フローに影響を与えることなく、メイン コード フロー内のターゲット オブジェクトを変更または「装飾」する 1 つ以上のデコレーターを直接挿入できるように構築されています。
  7. *
  8. */
  9. class CD {
  10. public $trackList;
  11. public function __construct() {
  12. $this->trackList = array();
  13. }
  14. public function addTrack($track) {
  15. $this->trackList[] = $track;
  16. }
  17. public function getTrackList() {
  18. $output = '';
  19. foreach ($this->trackList as $num => $track) {
  20. $output .= ($num + 1) 。 ") {$track}.";
  21. }
  22. return $output;
  23. }
  24. }
  25. $tracksFroExternalSource = array("What It Means", "Brr", "Goodbye");
  26. $myCD = 新しい CD ();
  27. foreach ($tracksFroExternalSource as $track) {
  28. $myCD->addTrack($track);
  29. }
  30. print "CD には次の内容が含まれています:{$myCD->getTrackList()}n";
  31. /**
  32. * 要件の小さな変更: 各出力パラメーターを大文字にする必要があります。このような小さな変更の場合、最良のアプローチは、基本クラスを変更したり、親子関係を作成したりするのではなく、デコレーターベースのデザインパターンを作成することです。物体。
  33. *
  34. */
  35. class CDTrackListDecoratorCaps {
  36. private $_cd;
  37. public function __construct(CD $cd) {
  38. $this->_cd = $cd;
  39. }
  40. public function makeCaps() {
  41. foreach ($this->_cd->trackList as & $track) {
  42. $track = strtoupper($track);
  43. }
  44. }
  45. }
  46. $myCD = new CD();
  47. foreach ($tracksFroExternalSource as $track) {
  48. $myCD->addTrack($track);
  49. }
  50. //新增以下代码实现输出パラメータ取用大写形
  51. $myCDCaps = new CDTrackListDecoratorCaps($myCD);
  52. $myCDCaps->makeCaps ();
  53. print "CD には次の内容が含まれています:{$myCD->getTrackList()}n";
  54. /* Decorator.class.php の終わり */
  55. /* ファイルの場所 Design/Decorator.class.php */
复制代
  1. ?/**
  2. * 『PHP デザイン パターン』第 7 章: デリゲート パターンより転載
  3. * オブジェクトに、決定に基づいて実行する必要がある複雑で独立した機能のいくつかの部分が含まれている場合、最良の方法は、デリゲート デザイン パターンに基づいてオブジェクトを適用することです。
  4. *
  5. */
  6. /**
  7. * 例: Web サイトには MP3 ファイルのプレイリストを作成する機能があり、プレイリストを M3U または PLS 形式でダウンロードすることを選択する機能もあります。
  8. *
  9. * 次のコード例は、通常モードと委任モードの 2 つのモードの実装を示しています
  10. *
  11. */
  12. //常规实现
  13. クラスプレイリスト {
  14. プライベート$_songs;
  15. public function __construct() {
  16. $this->_songs = array();
  17. }
  18. public function addSong($location, $title) {
  19. $song = array("location" => $location, "title" => $title);
  20. $this->_songs[] = $song;
  21. }
  22. public function getM3U() {
  23. $m3u = "#EXTM3Unn";
  24. foreach ($this-> ;_songs as $song) {
  25. $m3u .= "#EXTINF: -1, {$song['title']}n";
  26. $m3u .= "{$song['location']}n";
  27. }
  28. return $m3u;
  29. }
  30. public function getPLS() {
  31. $pls = "[playlist]]nNumberOfEntries = "。 count($this->_songs) 。 "nn";
  32. foreach ($this->_songs as $songCount => $song) {
  33. $counter = $songCount + 1;
  34. $pls .= "File{$counter} = {$song[' location']}n";
  35. $pls .= "タイトル{$counter} = {$song['title']}n";
  36. $pls .= "LengthP{$counter} = -1 nn";
  37. }
  38. return $pls;
  39. }
  40. }
  41. $playlist = new Playlist();
  42. $playlist->addSong("/home/aaron/music/brr.mp3", "Brr");
  43. $playlist ->addSong("/home/aaron/music/goodbye.mp3", "Goodbye");
  44. $externalRetrievedType = "pls";
  45. if ($externalRetrievedType == "pls") {
  46. $playlistContent = $ playlist->getPLS();
  47. } else {
  48. $playlistContent = $playlist->getM3U();
  49. }
  50. echo $playlistContent;
  51. //委任托モード实现
  52. class newPlaylist {
  53. private $_songs;
  54. private $_tyepObject;
  55. public function __construct($type) {
  56. $this->_songs = array();
  57. $object = "{$type}Playlist";
  58. $this->_tyepObject = new $object ;
  59. }
  60. public function addSong($location, $title) {
  61. $song = array("location" => $location, "title" => $title);
  62. $this->_songs[] = $song;
  63. }
  64. public function getPlaylist() {
  65. $playlist = $this->_tyepObject->getPlaylist($this->_songs);
  66. return $playlist;
  67. }
  68. }
  69. class m3uPlaylist {
  70. public function getPlaylist($songs) {
  71. $m3u = "#EXTM3Unn";
  72. foreach ($songs as $song) {
  73. $m3u .= "#EXTINF: -1, {$song['title'] }n";
  74. $m3u .= "{$song['location']}n";
  75. }
  76. return $m3u;
  77. }
  78. }
  79. class plsPlaylist {
  80. public function getPlaylist($songs) {
  81. $ pls = "[プレイリスト]]nNumberOfEntries = "。 count($songs) 。 "nn";
  82. foreach ($songs as $songCount => $song) {
  83. $counter = $songCount + 1;
  84. $pls .= "File{$counter} = {$song['location']} n";
  85. $pls .= "タイトル{$counter} = {$song['title']}n";
  86. $pls .= "LengthP{$counter} = -1 nn";
  87. }
  88. return $ pls;
  89. }
  90. }
  91. $externalRetrievedType = "pls";
  92. $playlist = new newPlaylist($externalRetrievedType);
  93. $playlist->addSong("/home/aaron/music/brr.mp3", "Brr ");
  94. $playlist->addSong("/home/aaron/music/goodbye.mp3", "Goodbye");
  95. $playlistContent = $playlist->getPlaylist();
  96. echo $playlistContent;
  97. /* Delegate.class.php の終わり */
  98. /* ファイルの場所 Design/Delegate.class.php */
复制代码
  1. ?/**
  2. * 『PHP デザイン パターン』第 8 章: 外観パターンより転載
  3. * 外観デザイン パターンの目的は、複雑な外部関係を制御し、上記のコンポーネントの機能を利用するためのシンプルなインターフェイスを提供することです。
  4. * ビジネスプロセスの特定のステップを実行するために必要な複雑なメソッドと論理グループを隠すには、外観デザインパターンに基づいたクラスを使用する必要があります。
  5. *
  6. */
  7. /**
  8. * コード例: CD オブジェクトを取得し、そのすべてのプロパティに大文字を適用し、Web サービスに送信する完全にフォーマットされた XML ドキュメントを作成します。
  9. *
  10. */
  11. class CD {
  12. public $tracks = array();
  13. public $band = '';
  14. public $title = '';
  15. public function __construct($tracks, $band, $title) {
  16. $this->tracks = $tracks;
  17. $this->band = $band;
  18. $this-> ;title = $title;
  19. }
  20. }
  21. class CDUpperCase {
  22. public static function makeString(CD $cd, $type) {
  23. $cd->gt;$type = strtoupper($cd->$type) ;
  24. }
  25. public static function makeArray(CD $cd, $type) {
  26. $cd->$type = array_map("strtoupper", $cd->$type);
  27. }
  28. }
  29. class CDMakeXML {
  30. public static function create(CD $cd) {
  31. $doc = new DomDocument();
  32. $root = $doc->createElement("CD");
  33. $root = $doc->appendChild( $root);
  34. $title = $doc->createElement("TITLE", $cd->title);
  35. $title = $root->appendChild($title);
  36. $band = $doc ->createElement("BAND", $cd->band);
  37. $band = $root->appendChild($band);
  38. $tracks = $doc->createElement("TRACKS");
  39. $tracks = $root->appendChild($tracks);
  40. foreach ($cd->tracks as $track) {
  41. $track = $doc->createElement("TRACK", $track);
  42. $ track = $tracks->appendChild($track);
  43. }
  44. return $doc->saveXML();
  45. }
  46. }
  47. class WebServiceFacade {
  48. public static function makeXMLCall(CD $cd) {
  49. CDUpperCase ::makeString($cd, "タイトル");
  50. CDUpperCase::makeString($cd, "バンド");
  51. CDUpperCase::makeArray($cd, "トラック");
  52. $xml = CDMakeXML::create( $cd);
  53. return $xml;
  54. }
  55. }
  56. $tracksFromExternalSource = array("どういう意味ですか", "Brr", "さようなら");
  57. $band = "二度としない";
  58. $title = "肋骨の無駄遣い";
  59. $cd = 新しい CD($tracksFromExternalSource, $band, $title);
  60. $xml = WebServiceFacade::makeXMLCall($cd);
  61. echo $xml;
  62. /* End Facade.class.php の */
  63. /* ファイルの場所 Design/Facade.class.php */
复制代
  1. ?/**
  2. * 『PHP デザイン パターン』第 9 章: ファクトリ パターンより転載
  3. * ファクトリ デザイン パターン: オブジェクトの新しいインスタンスを取得するためのインターフェイスを提供し、呼び出し元のコードが基本クラスを実際にインスタンス化する手順を決定することを回避できるようにします
  4. *
  5. */
  6. //ベーシックスタンダードCDクラス
  7. クラスCD {
  8. public $tracks = array();
  9. public $band = '';
  10. public $ title = '';
  11. public function __construct() {}
  12. public function setTitle($title) {
  13. $this->title = $title;
  14. }
  15. public function setBand($band) {
  16. $this ->band = $band;
  17. }
  18. public function addTrack($track) {
  19. $this->tracks[] = $track;
  20. }
  21. }
  22. //拡張 CD クラス、および標準 CD唯一の違いは、CD に書き込まれる最初のトラックがデータ トラック("DATA TRACK") であることです
  23. class enhadcedCD {
  24. public $tracks = array();
  25. public $band = '';
  26. public $title = '' ;
  27. パブリック関数 __construct() {
  28. $this->tracks = "データ トラック";
  29. }
  30. パブリック関数 setTitle($title) {
  31. $this->title = $title;
  32. }
  33. パブリック関数setBand($band) {
  34. $this->band = $band;
  35. }
  36. public function addTrack($track) {
  37. $this->tracks[] = $track;
  38. }
  39. }
  40. / / CD ファクトリ クラスは、上記の 2 つのクラスの特定のインスタンス化操作を実装します。
  41. }
  42. }
  43. //インスタンス操作
  44. $type = "enhadced";
  45. $cd = CDFactory::create($type);
  46. $tracksFromExternalSource = array("意味", "Brr", "さようなら");
  47. $cd->setBand("もう二度と");
  48. $cd->setTitle("肋骨の無駄遣い");
  49. foreach ($tracksFromExternalSource as $track) {
  50. $cd- > ;addTrack($track);
  51. }
  52. /* Factory.class.php の終わり */
  53. /* ファイルの終わり Design/Factory.class.php */
  54. コードをコピー
?/**
* 『PHP デザインパターン』第 10 章: インタプリタ パターンより転載
* インタプリタ: インタプリタ デザイン パターンは、エンティティの主要な要素を分析し、各要素に独自の説明や対応するアクションを提供するために使用されます。
* インタプリタ設計パターンは、PHP/HTML テンプレート システムで最も一般的に使用されます。
    *
  1. */
  2. class User {
  3. protected $_username = "";
  4. public function __construct($username) {
  5. $this->_username = $ username;
  6. }
  7. public function getProfilePage() {
  8. $profile = "

    Never Again が好きです !

    ";
  9. $profile .= "彼らの曲はすべて大好きです。私のお気に入りの CD:
    ";
  10. $profile .= "{{myCD.getTitle}}!!";
  11. return $profile;
  12. }
  13. }
  14. class userCD {
  15. protected $_user = NULL;
  16. public function setUser(User $user) {
  17. $this->_user = $user;
  18. }
  19. public function getTitle() {
  20. $title = "肋骨の無駄";
  21. return $title;
  22. }
  23. }
  24. class userCDInterpreter {
  25. protected $_user = NULL;
  26. public function setUser(User $user) {
  27. $this->_user = $user;
  28. }
  29. public function getInterpreted() {
  30. $profile = $this->_user->getProfilePage();
  31. if (preg_match_all('/{{myCD.(.*?)}}/', $profile, $triggers, PREG_SET_ORDER)) {
  32. $replacements = array ();
  33. foreach ($triggers as $trigger) {
  34. $replacements[] = $trigger[1];
  35. }
  36. $replacements = array_unique($replacements);
  37. $myCD = new userCD();
  38. $myCD->setUser($this->_user);
  39. foreach ($replacements as $replacement) {
  40. $profile = str_replace("{{myCD.{$replacement}}}", call_user_func(array($ myCD, $replacement)), $profile);
  41. }
  42. }
  43. return $profile;
  44. }
  45. }
  46. $username = "aaron";
  47. $user = new User($username);
  48. $interpreter = new userCDInterpreter();
  49. $interpreter->setUser($user);
  50. print "

    {$username} のプロフィール

    ";
  51. print $interpreter->getInterpreted();
  52. /* Interpreter.class.php の終わり */
  53. /* ファイルの場所 Design/Interpreter.class.php */
  54. コードをコピー
    1. ?/**
    2. * 「PHP デザイン パターン」第 11 章: イテレータ パターンより転載
    3. * イテレータ: イテレータ デザイン パターンは、あらゆる種類の可算データをループまたは反復するための単一の標準インターフェイスを提供できる特定のオブジェクトを構築するのに役立ちます。
    4. * 走査する必要がある可算データを扱う場合、最良の解決策はイテレーター設計パターンに基づいてオブジェクトを作成することです。
    5. *
    6. */
    7. class CD {
    8. public $band = "";
    9. public $title = "";
    10. public $trackList = array();
    11. public function __construct($band, $title) {
    12. $this->band = $band;
    13. $this->title = $title;
    14. }
    15. public function addTrack($track) {
    16. $this-> ;trackList[] = $track;
    17. }
    18. }
    19. class CDSearchByBandIterator は Iterator を実装します {
    20. private $_CDs = array();
    21. private $_valid = FALSE;
    22. public function __construct($bandName) {
    23. $db = mysql_connect("localhost", "root", "root");
    24. mysql_select_db("test");
    25. $sql = "CD.id、CD.band、CD.title、tracks.tracknum、tracks.title を選択しますtracktitle ";
    26. $sql .= "CD の左側から CD 上のトラックを結合します。id =tracks.cid ";
    27. $sql .= "where Band = '" 。 mysql_real_escape_string($bandName) 。 "' ";
    28. $sql .= "tracks.tracknum で並べ替え";
    29. $results = mysql_query($sql);
    30. $cdID = 0;
    31. $cd = NULL;
    32. while ($result = mysql_fetch_array( $results)) {
    33. if ($result["id"] !== $cdID) {
    34. if ( ! is_null($cd)) {
    35. $this->_CDs[] = $cd;
    36. }
    37. $cdID = $result['id'];
    38. $cd = 新しい CD($result['band'], $result['title']);
    39. }
    40. $cd->addTrack($result[' tracktitle']);
    41. }
    42. $this->_CDs[] = $cd;
    43. }
    44. public function next() {
    45. $this->_valid = (next($this->_CDs) = == 偽) ? FALSE : TRUE;
    46. }
    47. public function rewind() {
    48. $this->_valid = (reset($this->_CDs) === FALSE) ? FALSE : TRUE;
    49. }
    50. public function valid() {
    51. return $this->_valid;
    52. }
    53. public function current() {
    54. return current($this->_CDs);
    55. }
    56. public function key() {
    57. return key($this->_CDs);
    58. }
    59. }
    60. $queryItem = "二度としない";
    61. $cds = new CDSearchByBandIterator($queryItem);
    62. print "";
    63. print "th>トラック数";
    64. foreach ($cds as $cd) {
    65. print "
    66. title}";
    67. }
    68. print "
    69. バンドTtile
      {$cd->band}";
    70. 印刷数($cd->trackList)。 "
    71. ";
    72. /* Iterator.class.php の終わり */
    73. /* ファイル Design/Iterator.class を配置します。 php */
    复制代
    1. ?/**
    2. * 「PHP デザイン パターン」第 12 章: メディエーター パターンより転載
    3. * メディエーター: メディエーター デザインは、これらのオブジェクトのコレクションを直接変更することなく、類似したオブジェクト間の相互作用を伝達または仲介できるオブジェクトの開発には使用しないでください。
    4. * 同様のプロパティを持ち、プロパティの同期を保つ必要がある、結合されていないオブジェクトを扱う場合、ベスト プラクティスは、Mediator デザイン パターンに基づいたオブジェクトを使用することです。
    5. *
    6. */
    7. /**
    8. * テスト ケースの説明: サンプル コードにより、バンドが音楽コレクションを入力して管理できるだけでなく、バ​​ンドが設定ファイルを更新し、バンド関連情報を変更し、CD 情報を更新することもできます
    9. * アーティストは MP3 コレクションをアップロードできるようになりましたWeb からダウンロードしてください。サイトから CD がダウンロードされました。 したがって、Web サイトでは、対応する CD と MP3 を相互に同期しておく必要があります。
    10. *
    11. */
    12. //CD类
    13. class CD {
    14. public $band = '';
    15. public $title = '';
    16. protected $_mediator;
    17. public function __construct(MusicContainerMediator $mediator = NULL) {
    18. $this->_mediator = $mediator;
    19. }
    20. public function save() {
    21. // 特定の实现待ち定
    22. var_dump ($this);
    23. }
    24. public function changeBandName($bandname) {
    25. if ( ! is_null($this->_mediator)) {
    26. $this->_mediator->change($this, array("バンド" => $bandname));
    27. }
    28. $this->band = $bandname;
    29. $this->save();
    30. }
    31. }
    32. //MP3Archive类
    33. class MP3Archive {
    34. protected $_mediator;
    35. public function __construct(MusicContainerMediator $mediator = NULL) {
    36. $this->_mediator = $mediator;
    37. }
    38. public function save() {
    39. // 特定の实现待ち
    40. var_dump($this);
    41. }
    42. public function changeBandName($bandname) {
    43. if ( ! is_null($this->_mediator)) {
    44. $this->_mediator->change($this, array("band" => $bandname));
    45. }
    46. $this->band = $bandname;
    47. $this->save();
    48. }
    49. }
    50. //中介者类
    51. class MusicContainerMediator {
    52. protected $_containers = array ();
    53. public function __construct() {
    54. $this->_containers[] = "CD";
    55. $this->_containers[] = "MP3Archive";
    56. }
    57. public function change($originalObject, $newValue) {
    58. $title = $originalObject->title;
    59. $band = $originalObject->band;
    60. foreach ($this->_containers as $container) {
    61. if ( ! ($originalObject instanceof $container)) {
    62. $object = new $container;
    63. $object->title = $title;
    64. $object->band = $band;
    65. foreach ($newValue as $key => ; $val) {
    66. $object->$key = $val;
    67. }
    68. $object->save();
    69. }
    70. }
    71. }
    72. }
    73. //测试实例
    74. $titleFromDB = "リブの";
    75. $bandFromDB = "二度と";
    76. $mediator = new MusicContainerMediator();
    77. $cd = 新しい CD($mediator);
    78. $cd->title = $titleFromDB;
    79. $cd ->band = $bandFromDB;
    80. $cd->changeBandName("Maybe Once More");
    81. /* Mediator.class.php の終わり */
    82. /* ファイルの場所 Design/Mediator.class.php */
    复制代
    1. /*
    2. SQLyog 企业版 - MySQL GUI v8.14
    3. MySQL - 5.1.52-コミュニティ : データベース - テスト
    4. ********************* ************************************************
    5. * /
    6. /*!40101 SET NAMES utf8 */;
    7. /*!40101 SET SQL_MODE=''*/;
    8. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    9. /* !40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    10. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    11. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOテス、 SQL_NOTES=0 */;
    12. /*テーブル `cd` のテーブル構造 */
    13. DROP TABLE IF EXISTS `cd`;
    14. CREATE TABLE `cd` (
    15. `id` int(8) NOT NULL AUTO_INCREMENT,
    16. ` Band` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT '',
    17. `title` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT '',
    18. `bought` int(8) DEFAULT NULL,
    19. `amount` int(8) DEFAULT NULL,
    20. PRIMARY KEY (`id`)
    21. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    22. /*テーブル `cd` のデータ */
    23. insert into `cd`(`id` ,`バンド`,`タイトル`,`購入`,`金額`) 値 (1,'Never Again','Waster of a Rib',1,98);
    24. /*テーブル `tracks` のテーブル構造 * /
    25. DROP TABLE IF EXISTS `tracks`;
    26. CREATE TABLE `tracks` (
    27. `cid` int(8) DEFAULT NULL,
    28. `tracknum` int(8) DEFAULT NULL,
    29. `title` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT ''
    30. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    31. /*テーブル `tracks` のデータ */
    32. insert into `tracks`(`cid`,`tracknum`,`title `) 値 (1,3,'意味'),(1,3,'Brr'),(1,3,'さようなら');
    33. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    34. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    35. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    36. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    复制


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。