ホームページ バックエンド開発 PHPチュートリアル PHP オブジェクト指向の高度な設計パターン: 委任パターンの使用例

PHP オブジェクト指向の高度な設計パターン: 委任パターンの使用例

May 22, 2017 pm 02:07 PM

オブジェクト指向プログラミングの最も強力な機能の 1 つは、その動的な性質です。機能が増え続け、ハイブリッドな建物構造があり、標準が進化する世界では、動的コードはまったく新しい意味を持ちます。新しいファイル ストレージ標準やストリーミング標準、ソーシャル ネットワーキング サイトやインターネット パイオニア API を使用した新しいものなど、Web プログラミングは常に変化しています。量刑に取り組む従来の方法は、利用可能な膨大な数の選択肢を前にした今日ではもはや効果的ではありません。インテリジェント オブジェクトを適切な場所に移動することにより、デリゲート デザイン パターンは複雑な意思決定を不要にします。

委任モードとは何ですか?

他のオブジェクトに割り当てたり委任したりすることで、委任設計パターンはコア オブジェクトから決定や複雑な機能を削除できます。

委任パターンの適用の問題と解決策

ほとんどの PHP プログラマーは、最初はプログラマティック プログラミングの種類にほぼ慣れています。このプログラミング スタイルは、条件ステートメントに基づくフロー制御に大きく依存しています。オブジェクト指向プログラミングは、従来の条件文に代わるいくつかの方法を提供し、それによってよりステートフルなコード フローを作成します。この機能を実現する 1 つの方法は、デリゲート デザイン パターンに基づいてオブジェクトを作成することです。

Delegate デザイン パターンは、コア オブジェクトから複雑さを取り除くことを目指しています。現時点では、条件文の評価による特定の機能の実行に大きく依存するオブジェクトは設計していません。委任パターンに基づくオブジェクトは、決定を別のオブジェクトに委任できます。委任は、中間オブジェクトを使用してデシジョン ツリーを処理するという単純なものもあれば、動的にインスタンス化されたオブジェクトを使用して目的の機能を提供するような複雑なものもあります。

デリゲートの設計パターンを条件付きステートメントの直接の競合相手と考えないことが非常に重要です。対照的に、デリゲート デザイン パターンは、条件ステートメントを必要とせずに正しい機能を呼び出すことで、アーキテクチャの構造化に役立ちます。条件ステートメントは実際のメソッド内に配置するのが最適であり、ビジネス ルールの処理はメソッド内で完了します。

デリゲート デザイン パターンの使用例は、データの特定の部分に複数の形式を提供することです。オープン ソース コード リポジトリにアーカイブがあるとします。訪問者がソース コードの一部をダウンロードする場合、2 つの異なるファイル形式から選択できます。指定したファイルは圧縮されてブラウザに送信されます。この例では、zip および tgz 圧縮形式のファイルを取得するつもりです。

オブジェクトに、決定に基づいて実行する必要がある複雑だが独立した機能が含まれている場合、ベスト プラクティスは、デリゲート デザイン パターンに基づいてオブジェクトを使用することです。


UML

この UML 図は、デリゲート設計パターンを使用したクラス設計を詳しく示しています。

PHP オブジェクト指向の高度な設計パターン: 委任パターンの使用例PHP オブジェクト指向の高度な設計パターン: 委任パターンの使用例

以下は上の図の説明です:

1. 基本クラス MyObject は、デリゲート デザイン パターンに基づくオブジェクトが使用されることを認識しています。このクラスには、プライベート文字列 delegateType と、MyDelegateObject のプライベート インスタンス externalDelegate が含まれます。

2. setDelegateType() メソッドは、delegateType 文字列に格納される type という名前のパラメーターを受け取ります。

3. createDelegateObject() メソッドはデリゲート オブジェクトのインスタンスを作成し、delegateType 変数に従ってインスタンスに名前を付けます。次に、このメソッドはインスタンスを externalDelegate に割り当てることで内部に保存します。

4. runDelegateAction() メソッドは、internalDelegate オブジェクトの action() メソッドを実行します。

5.MyDelegateObject には、特定のアクションを担当するロジックが含まれています。 MyObject は、action() メソッドを実行して特定の関数を実装します。

アプリケーションシナリオ

mp3再生モードとmp4再生モードを持つcdクラスを設計しました

改善前、cdクラス再生モードを使用する場合、インスタンス化されたクラスでどの再生モードを選択するかを決定する必要があります

後改善により、再生モードがパラメータとして playList 関数に渡され、対応する再生メソッドが自動的に検索されるようになりました。

コード: cdクラス、改善前、再生モードの選択が面倒

使用例:

<?php  
//委托模式-去除核心对象中的判决和复杂的功能性  
//使用委托模式之前,调用cd类,选择cd播放模式是复杂的选择过程  
class cd {  
protected $cdInfo = array();   
 
public function addSong($song) {  
       $this->cdInfo[$song] = $song;  
}  
      
public function playMp3($song) {  
        return $this->cdInfo[$song] . &#39;.mp3&#39;;  
    }  
      
    public function playMp4($song) {  
        return $this->cdInfo[$song] . &#39;.mp4&#39;;  
    }  
}  
$oldCd = new cd;  
$oldCd->addSong("1");  
$oldCd->addSong("2");  
$oldCd->addSong("3");  
$type = &#39;mp3&#39;;  
if ($type == &#39;mp3&#39;) {  
    $oldCd->playMp3();  
} else {  
    $oldCd->playMp4();  
}
ログイン後にコピー

コード: デリゲーションモードで改善されたcdクラス

<?php  
//委托模式-去除核心对象中的判决和复杂的功能性  
//改进cd类  
class cdDelegate {  
    protected $cdInfo = array();   
      
    public function addSong($song) {  
        $this->cdInfo[$song] = $song;  
    }  
      
    public function play($type, $song) {  
        $obj = new $type;  
        return $obj->playList($this->cdInfo, $song);  
    }  
}  
  
class mp3 {  
    public function playList($list) {  
        return $list[$song];  
    }  
}  
  
class mp4 {  
    public function playList($list) {          return $list[$song];  
    }  
}  
  
$newCd = new cd;  
$newCd->addSong("1");  
$newCd->addSong("2");  
$newCd->addSong("3");  
$type = &#39;mp3&#39;;  
$oldCd->play(&#39;mp3&#39;, &#39;1&#39;); //只要传递参数就能知道需要选择何种播放模式
ログイン後にコピー

以上がPHP オブジェクト指向の高度な設計パターン: 委任パターンの使用例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 の高度な機能: オブジェクト指向プログラミングのベスト プラクティス Jun 05, 2024 pm 09:39 PM

PHP における OOP のベスト プラクティスには、命名規則、インターフェイスと抽象クラス、継承とポリモーフィズム、依存関係の注入が含まれます。実際のケースには、ウェアハウス モードを使用してデータを管理する場合や、ストラテジー モードを使用して並べ替えを実装する場合などがあります。

Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違い Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違い Jun 02, 2024 pm 12:59 PM

Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違いは、デザイン パターンがソフトウェア設計における一般的な問題に対する抽象的な解決策を定義し、ファクトリ パターンなどのクラスとオブジェクト間の相互作用に焦点を当てていることです。アーキテクチャ パターンは、階層化アーキテクチャなどのシステム コンポーネントの編成と相互作用に焦点を当てて、システム構造とモジュールの間の関係を定義します。

PHP オブジェクト指向プログラミングの深い理解: オブジェクト指向プログラミングのデバッグ手法 PHP オブジェクト指向プログラミングの深い理解: オブジェクト指向プログラミングのデバッグ手法 Jun 05, 2024 pm 08:50 PM

オブジェクトのステータスの追跡、ブレークポイントの設定、例外の追跡を習得し、xdebug 拡張機能を利用することで、PHP オブジェクト指向プログラミング コードを効果的にデバッグできます。 1. オブジェクトのステータスを追跡する: var_dump() と print_r() を使用して、オブジェクトの属性とメソッドの値を表示します。 2. ブレークポイントの設定: 開発環境にブレークポイントを設定すると、実行がブレークポイントに到達するとデバッガが一時停止するため、オブジェクトのステータスを簡単に確認できます。 3. 例外のトレース: try-catch ブロックと getTraceAsString() を使用して、例外発生時のスタック トレースとメッセージを取得します。 4. デバッガーを使用します。xdebug_var_dump() 関数は、コードの実行中に変数の内容を検査できます。

Java デザイン パターンにおけるデコレータ パターンの分析 Java デザイン パターンにおけるデコレータ パターンの分析 May 09, 2024 pm 03:12 PM

デコレータ パターンは、元のクラスを変更せずにオブジェクトの機能を動的に追加できる構造設計パターンです。抽象コンポーネント、具象コンポーネント、抽象デコレータ、具象デコレータの連携によって実装され、ニーズの変化に合わせてクラス機能を柔軟に拡張できます。この例では、ミルクとモカのデコレーターが総額 2.29 ドルで Espresso に追加されており、オブジェクトの動作を動的に変更するデコレーター パターンの力を示しています。

Java 設計パターンにおけるアダプター パターンの素晴らしい使用法 Java 設計パターンにおけるアダプター パターンの素晴らしい使用法 May 09, 2024 pm 12:54 PM

アダプター パターンは、互換性のないオブジェクトが連携できるようにする構造設計パターンであり、オブジェクトがスムーズに対話できるように、あるインターフェイスを別のインターフェイスに変換します。オブジェクト アダプタは、適応されたオブジェクトを含むアダプタ オブジェクトを作成し、ターゲット インターフェイスを実装することにより、アダプタ パターンを実装します。実際のケースでは、クライアント (MediaPlayer など) はアダプター モードを通じて高度な形式のメディア (VLC など) を再生できますが、クライアント自体は通常のメディア形式 (MP3 など) のみをサポートします。

PHP デザイン パターン: テスト駆動開発の実践 PHP デザイン パターン: テスト駆動開発の実践 Jun 03, 2024 pm 02:14 PM

TDD は、高品質の PHP コードを作成するために使用されます。その手順には、テスト ケースを作成し、期待される機能を記述し、テスト ケースを失敗させることが含まれます。過度な最適化や詳細な設計を行わずに、テスト ケースのみが通過するようにコードを記述します。テスト ケースが合格したら、コードを最適化およびリファクタリングして、可読性、保守性、およびスケーラビリティを向上させます。

Guice フレームワークでのデザイン パターンの適用 Guice フレームワークでのデザイン パターンの適用 Jun 02, 2024 pm 10:49 PM

Guice フレームワークは、次のような多くの設計パターンを適用します。 シングルトン パターン: @Singleton アノテーションによってクラスのインスタンスが 1 つだけであることを保証します。ファクトリ メソッド パターン: @Provides アノテーションを使用してファクトリ メソッドを作成し、依存関係の注入中にオブジェクト インスタンスを取得します。戦略モード: アルゴリズムをさまざまな戦略クラスにカプセル化し、@Named アノテーションを通じて特定の戦略を指定します。

Java フレームワークでデザイン パターンを使用する利点と欠点は何ですか? Java フレームワークでデザイン パターンを使用する利点と欠点は何ですか? Jun 01, 2024 pm 02:13 PM

Java フレームワークでデザイン パターンを使用する利点には、コードの可読性、保守性、拡張性の向上が含まれます。欠点としては、複雑さ、パフォーマンスのオーバーヘッド、使いすぎによる学習曲線の急上昇などが挙げられます。実際のケース: プロキシ モードはオブジェクトの遅延読み込みに使用されます。デザイン パターンを賢く使用して、その利点を活用し、欠点を最小限に抑えます。

See all articles