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

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

Jun 20, 2016 pm 12:27 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles