ホームページ >バックエンド開発 >PHPチュートリアル >PHP設計パターン(3):構造パターン

PHP設計パターン(3):構造パターン

WBOY
WBOYオリジナル
2016-06-20 12:27:41779ブラウズ

1. 構造パターンとは何ですか?
構造パターンとは、クラスやオブジェクトの内部構造や外部の組み合わせを解析し、プログラム構造を最適化することでモジュール間の結合問題を解決するものです。

2. 構造パターンの種類:
アダプター パターン
ブリッジ パターン
装飾パターン
コンビネーション パターン
外観パターン
フライウェイト パターン
エージェント パターン

1. アダプター パターン (Adapter)
クラスのインターフェイスを顧客が望む別のインターフェイスに変換します。アダプター パターンを使用すると、インターフェイスの互換性がないために元々連携できなかったクラスが連携できるようになります。
アプリケーション シナリオ: 古いコード インターフェイスが新しいインターフェイスの要件を満たしていないか、コードが複雑すぎて変更を続けることができないか、またはサードパーティのクラス ライブラリが使用されています。

コードの実装

    /**                                                                                   */
  1. {
  2. private $name; 🎜>
  3. 関数 __construct ($name) {
  4. $this->name = $name;
  5. }
  6. public function getName() {
  7. return $this- >name;
  8. }
  9. }
  10. 🎜>
  11. // 新しいコード、オープンプラットフォーム標準インターフェース>
  12. protected $user;
  13. function __construct($user) {
  14. $this->user = $user;
  15. }
  16. public function getUserName() { 🎜>
  17. $ olduser = new User('Zhang San');
  18. echo $olduser->getName()."n";
  19. $newuser = new UserInfo($olduser);
  20. echo $newuser->getUserName()."n";
  21. コードをコピー
  22. 注: ここでの新しいインターフェイスは次の組み合わせで使用します。この構造は実際には結合モードです。 UserInfo は User を継承することで同じ目的を達成できますが、結合度が高く、相互に影響を及ぼしますので、継承は使用しないでください。
  23. 2. ブリッジモード
  24. 抽象部分を実装部分から分離し、独立して変更できるようにします
  25. 特徴: 独立した存在、強力な拡張性
  26. アプリケーション: 継続する必要がありますオブジェクトを呼び出しますが、同じ呼び出しメソッドを実行して拡張機能を実現します
  27. コードの実装
    1. /**                                                                                        */
    2. abstract class person {
    3. abstract function getJob();    
    4. }
    5. class Student extends person {
    6. public function getJob() {
    7. 「学生」を返します。    
    8. }
    9. }
    10. class Teacher extends person {
    11. public function getJob() {
    12. 戻る「老师」;    
    13. }
    14. }
    15. class BridgeObj {
    16. protected $_person;    
    17. public function setperson($person) {
    18. $this->_person = $person;    
    19. }
    20. public function getJob() {
    21. return $this->_person->getJob();    
    22. }
    23. }
    24. $obj = new BridgeObj();    
    25. $obj->setperson(new Student());    
    26. printf("今回桥接对象:%sn", $obj->getJob());    
    27. $obj->setperson(new Teacher());    
    28. printf("今回桥接对象:%sn", $obj->getJob());
    29. 复制代码
    30. 3、実装モード
    31. は、既存のオブジェクトに追加の機能を追加します。 :完全に保護されるのではなく、原オブジェクトの追加機能が必要な場合に使用されます
    32. 代码实现
      /**
    1. *
    2. * デコレーションモード
    3. *
    4. */
    5. // 製品
    6. ABSTRACT クラス パーソン {
    7. ABSTRACT FUNCTION GETPERMISSION ;
    8. } 'public Document'; >_user = $user;
    9. }
    10. public function getPermission() {
    11. return $this->_user->getPermission() 。 ;_special;
    12. }
    13. } 🎜>
    14. class CPlusUser extends PermUser {
    15. protected $_special = 'c++ プログラム';
    16. }
    17. User();
    18. printf("permission: %sn", $user->getPermission());
    19. $user = new JavaUser($user); >printf("許可:%sn", $user->getPermission());
    20. $user = new CPlusUser($user);
    21. printf("許可:%sn") , $user->getPermission());
    22. コードをコピー
    23. 装飾と継承の違いについて考えてみませんか?
    24. 上記の例の場合、継承が使用されている場合、CPlusUser は JavaUser を継承しますか、それともその逆ですか?エンドユーザーがどれを必要とするかは誰にもわかりません。
    25. 多層関係の場合、装飾は順序とは関係がなく、いつでも装飾を追加できますが、継承は特定の順序でのみ行うことができるため、装飾モードはより柔軟になります。
    26. 4. 結合モード
    27. オブジェクトをツリー構造に結合して、「部分全体」の階層構造を表現します。
    28. 機能: 強力な柔軟性
    29. アプリケーション: オブジェクトの部分と全体の階層、ファジー結合オブジェクト、単純なオブジェクト処理問題
    30. コード実装
      1. /**                                                                               */
      2. //继承モード
      3. class UserBaseInfo {
      4. プライベート $name;     
      5. function __construct($name) {
      6. $this->name = $name;     
      7. }
      8. public function getName() {
      9. return $this->name;     
      10. }
      11. }
      12. class User extends UserBaseInfo {
      13. private $login = false;     
      14. public function setLogin($islogin) {
      15. $this->login = $islogin;     
      16. }
      17. public function isLogin() {
      18. return $this->login;     
      19. }
      20. }
      21. $user = new User('张三');     
      22. $user->setLogin(true);     
      23. if ($user->isLogin()) {
      24. echo $user->getName()."已经登录了n";     
      25. } else {
      26. echo $user->getName()."还没有登录n";     
      27. }
      28. //組合わせモード
      29. クラス ログイン情報 {
      30. 保護された $user;     
      31. protected $login = false;     
      32. public setLogin($user, $isLogin) {
      33. $this->user = $user;     
      34. $this->login = $isLogin;     
      35. }
      36. public function isLogin() {
      37. return $this->login;     
      38. }
      39. }
      40. $user = new User('Zhang San');
      41. $login = new LoginInfo();
      42. $login->setLogin ($user, true);
      43. if ($login->isLogin()) {
      44. echo $user->getName()."すでにログインしています";
      45. } else {
      46. echo $user->getName()."まだログインしていません"
      47. }
      48. / の部分は置き換え可能ですただし、継承はできません。
      49. class Admin {
      50. protected $level >level = $level;
      51. }
      52. $admin = 新しい管理者( 1);
      53. $login->setLogin($admin, true);
      54. if ($login-> isLogin()) {
      55. printf("レベル %d の管理者がログインしています n", $admin->getLevel());
      56. } else {
      57. printf("レベル %d の管理者はまだログインしていません", $admin->getLevel());
      58. }
      59. コードをコピー
      60. 上記の例はそれぞれ、新しい機能を処理するための継承と合成の違いは、単純な場合にはそれほど大きくないように見えますが、プロジェクトが後の段階でますます複雑になると、組み合わせモードの利点がますます明らかになります。
      61. 例えば、上記のログイン情報に、ログイン回数、最終ログイン時刻、ログインIPなどの情報を追加すると、ログイン自体がより複雑なオブジェクトになります。将来的に友人情報やユーザーのアクセス情報などの新たなニーズが発生し、それらを継承するとユーザークラスが非常に大きくなるのは必然であり、親との間で変数やメソッドが競合することは避けられません。クラスが多くなり、外部アクセスするユーザークラスも多くなり、その方法も手間がかかります。結合モードを採用すると、1 つのクラスが 1 つの役割を担当し、機能の区別が非常に明確になり、拡張が容易になります。
      62. 5. 外観モード (ファサード モード)
      63. システム内の一連のインターフェースに一貫したインターフェースを提供
      64. 機能: 上方抽出、共通性
      65. アプリケーション: 多数の内部インターフェース、統合インターフェース
      コード実装

      によって呼び出されます

      1. class Operation {
      2. public function testPlus() {
      3. printf("plus: %sn", (1 + 2 == 3 ? 'true' : 'false'));     
      4. }
      5. public function testMinus() {
      6. printf("minus: %sn", (3 - 2 == 2 ? 'true' : 'false') );     
      7. }
      8. public function testTimes() {
      9. printf("times: %sn", (2 * 3 == 6 ? 'true' : 'false') );     
      10. }
      11. }
      12. class Tester {
      13. protected $_operation;     
      14. function __construct() {
      15. $this->_operation = new Operation();     
      16. }
      17. public function testAll() {
      18. $this->_operation->testPlus();     
      19. $this->_operation->testMinus();     
      20. $this->_operation->testTimes();     
      21. }
      22. }
      23. //测试用例、测试全接続口
      24. $tester = newテスター();     
      25. $tester->testAll();     
      复制代

      门面模式估计大家在实际代网都已经使用了,インターフェース较多回同様の機能を有するインターフェースを一つのインターフェースに外部供給



      6. 共有要素モード
      は、共有技術を使用して、大量の同じコンテンツ オブジェクトの開始を回避するために、大量の粒度のオブジェクトを効果的にサポートします。
      特徴: 高効率、共有性
      用途: システムの最下層の設計。 $str1=”abc”,$str2=”abc” の文字列は、最初の文字列を直接参照します。$str1=”abc”,$str2=”abc”。内部に保存されている文字列 “abc” のみが作成され、$str1 が参照されます。

      7、プロキシモード
      は、他のオブジェクトにプロキシを提供して、このオブジェクトを制御します。つまり、特定のオブジェクトにプロキシを提供し、プロキシオブジェクトによって特定のオブジェクトを制御します。
      特徴: 低結合性、独立性、安全性
      ゲスト: アクセスできない、またはアクセスされる

      パスワードは、
      を介して実行されます。

      1. //内部オブジェクト
      2. class User {
      3. public function getName() {
      4. return 'Zhang San'; 🎜>
      5. }
      6. public function getType() {
      7. > //オープンプラットフォームなどのエージェントインターフェース定義
      8. インターフェース UserInterface {
      9. function getName();
      10. }
      11. // プロキシ オブジェクト
      12. クラス UserProxy 実装 UserInterface {
      13. protected $_user; >
      14. function __construct() {
      15. $this- >_user = new User( ; }
      16. }
      17. //内部呼び出し
      18. $user = new User();
      19. printf("ユーザー名: %sn" , $user->getName());
      20. printf("ユーザー タイプ: %sn", $user->getType());
      21. // 外部呼び出し
      22. // $user = new UserProxy();
      23. // printf ("ユーザー名: %sn", $user->getName());
      24. // printf ("ユーザー タイプ: %sn", $user->getType());アクセスするには、内部オブジェクトにこのメソッドがあることがすぐにわかります
      25. コードをコピー
      26. 3. 概要
      27. 1. プロキシ モードとアダプターの違いモード、ファサード モード、装飾モード
      28. a. 類似点: すべて内部オブジェクトをカプセル化し、内部オブジェクトのメソッドを呼び出します
      29. b. 相違点: それぞれに独自の特性とアプリケーション シナリオがあり、相互に置き換えることはできません。したがって、使用する場合は、どれが適しているかを慎重に分析する必要があります。
      30. 2. パターンの選択について
      31. パターンの選択は、ビジネス ロジックの慎重な分析を通じて実際のビジネス ニーズに基づいて行われ、パターンの特性とアプリケーション シナリオに基づいて合理的な選択と差別化が行われる必要があります。パターン。ほとんどの場合、ビジネスを実装するためにどのモデルを選択するかではなく、ビジネス シナリオによって決定されます。いくつかのケースでは実際に問題を解決できるため、重要なのは将来の拡張を考慮することです。
      32. これまでに 7 つの構造パターンについて学習しました。次の記事では、引き続きデザイン パターンの動作パターンを紹介します。まず、動作パターンの種類をプレビューしてみましょう。
      33. u テンプレート メソッド パターン
      34. u コマンドモード
      35. u イテレータモード
      36. u オブザーバーモード
      u ターミネータモード

      u メモモード

      u インタプリタモード

      u ステータスモード

      u ストラテジーモード

      u責任連鎖モード
      u ビジターモード


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