PHP デザイン パターン、デザイン パターン_PHP チュートリアル

WBOY
リリース: 2016-07-13 09:56:16
オリジナル
818 人が閲覧しました

php デザイン パターン、デザイン パターン

いくつかのパターンの簡単な説明:

1. ファクトリーモード

ファクトリ パターンは、オブジェクトを作成する特定のメソッドを持つクラスです。

new を直接使用する代わりに、ファクトリ クラスを使用してオブジェクトを作成できます。このようにすると、作成されるオブジェクトのタイプを変更する場合は、ファクトリを変更するだけで済みます。このファクトリを使用するすべてのコードは自動的に変更されます。

システムのある部分の関数とクラスは、システムの他の部分の関数とクラスの動作と構造に大きく依存します。

これらのクラスが相互に通信できるようにする一連のパターンが必要ですが、連動を避けるためにクラスをしっかりと結び付けることは望ましくありません。

大規模システムでは、多くのコードがいくつかの主要なクラスに依存しています。これらのクラスを変更する必要がある場合、問題が発生する可能性があります。

2. 単一要素モード

一部のアプリケーション リソースは、このタイプのリソースが 1 つしかないため排他的です。

たとえば、データベース ハンドルを介したデータベースへの接続は排他的です。

データベース ハンドルはアプリケーション全体で共有する必要があります。これは、接続を開いたままにしたり閉じたりしたままにするときにオーバーヘッドが発生するためであり、単一のページをフェッチするときにさらにオーバーヘッドが発生するためです。

3. オブザーバーモード

Observer パターンは、コンポーネント間の密結合を回避する別の方法を提供します。

パターンは非常に単純です。オブジェクトは、別のオブジェクト (オブザーバー) が自分自身を登録できるようにするメソッドを追加することで、自分自身を監視可能にします。

オブザーバブルが変更されると、登録されたオブザーバーにメッセージが送信されます。これらのオブザーバーは、この情報を使用して、監視可能なオブジェクトとは独立して操作を実行します。その結果、オブジェクトは理由を理解することなく相互に通信できるようになります。

4. コマンドチェーンモード

コマンド チェーン パターンは、疎結合トピックに基づいており、一連のハンドラーを通じてメッセージ、コマンド、リクエストを送信したり、任意のコンテンツを送信したりします。

各ハンドラーは、リクエストを処理できるかどうかを独自に判断します。可能な場合、リクエストは処理され、プロセスは停止します。他のハンドラーに影響を与えることなく、システムにハンドラーを追加または削除できます。

5. 戦略モード

最後に説明した設計パターンは戦略パターンです。このパターンでは、アルゴリズムが複雑なクラスから抽出されるため、簡単に置き換えることができます。

たとえば、検索エンジンでのページのランク付け方法を変更したい場合は、戦略モードが適しています。

検索エンジンの各部分について考えてみましょう。ある部分はページを横断し、ある部分は各ページをランク付けし、別の部分はランキングに基づいて結果を並べ替えます。

複雑な例では、これらの部分はすべて同じクラスに属します。 Strategy パターンを使用すると、配置部分を別のクラスに配置して、検索エンジンのコードの残りの部分に影響を与えることなく、ページの配置方法を変更できます。

コモンモードの詳細な説明:

1. シングルトン モード (プライベート 3 つとパブリック 1 つ)

①、プライベートコンストラクターメソッド (アクセス制御: 外部コードが new 演算子を使用してオブジェクトを作成するのを防ぎます。シングルトンクラスは他のクラスでインスタンス化できず、それ自体でのみインスタンス化できます)

②、プライベート静的プロパティ(クラスのインスタンスを保持する静的メンバー変数を持つ)

③. プライベート クローン メソッド (このインスタンスにアクセスするためのパブリック static メソッドがあります。 getInstance() メソッドは、シングルトン クラスをインスタンス化するためによく使用されます。クラスがインスタンス化されているかどうかは、instanceof 演算子を通じて検出できます)

④、パブリック静的メソッド (オブジェクトのコピーを防止)

いわゆるシングルトン モードとは、常にアプリケーション内にこのクラスのインスタンスが 1 つだけ存在することを意味します。

通常、シングルトン モードを使用して 1 つのオブジェクトのみがデータベースにアクセスできるようにすることで、複数のデータベース接続が開かれるのを防ぎます。

シングルトン クラスを実装するには、次の点を含める必要があります:

通常のクラスとは異なり、シングルトン クラスは直接インスタンス化できませんが、それ自体でのみインスタンス化できます。したがって、このような制限効果を得るには、コンストラクターをプライベートとしてマークする必要があります。

シングルトン クラスが直接インスタンス化されずに機能するには、そのようなインスタンスが提供される必要があります。

したがって、シングルトンクラスには、クラスのインスタンスを保存できるプライベート静的メンバー変数と、インスタンスにアクセスできる対応するパブリック静的メソッドが必要です。

PHP では、シングルトン クラス オブジェクトのクローン作成によって上記のシングルトン クラスの実装形式が崩れることを防ぐために、通常、ベースに空のプライベート __clone() メソッドが提供されます。

以下は基本的なシングルトン パターンです:

クラス SingetonBasic {

プライベート静的 $instance;

プライベート関数 __construct() {

構築します。

}

プライベート関数 __clone() {}

パブリック静的関数 getInstance() {

if (!(self::$instance instanceof self)) {

戻る

}

}

$a = SingetonBasic::getInstance();

$b = SingetonBasic::getInstance();

var_dump($a === $b);

2. ファクトリーモード

ファクトリ パターンを使用すると、入力パラメーターまたはアプリケーション構成に基づいて他のクラスのインスタンスを実装して返すように特別に設計されたクラスを作成できます。以下は最も基本的なファクトリーパターンです:

クラス FactoryBasic {

public static function create($config) {

}

}

たとえば、ここではシェイプ オブジェクトを記述するファクトリがあり、渡されたパラメータの数に基づいてさまざまなシェイプを作成することを望んでいます。

// 形状のパブリック関数を定義します: 周囲長と面積を取得します。

インターフェース IShape {

関数getCircum();

関数getArea();

}

//長方形クラスを定義する

クラス Rectangle は IShape {

を実装します

プライベート $width, $height;

パブリック関数 __construct($width, $height) {

$ this-> height

}

パブリック関数 getCircum() {

2 2*($ this-& gt; 幅 + $ this- & gt; 高さ

) を返します。

}

パブリック関数 getArea() {

戻る

}

}

//サークルクラスを定義する

クラス Circle 実装 IShape {

プライベート $radii;

パブリック関数 __construct($radii) {

}

パブリック関数 getCircum() {

2 2*m_pi*$ の半径を返します

;

}

パブリック関数 getArea() {

戻る

}

}

// 渡されたパラメーターの数に基づいて、さまざまなシェイプを作成します。

クラス FactoryShape {

パブリック静的関数 create() {

switch (func_num_args()) {

ケース 1:

N 新しい円を返します (Func_get_arg (0));

休憩;

ケース 2:

N 新しい四角形を返します (func_get_arg (0), func_get_arg (1));

休憩;

}

}

// 長方形のオブジェクト

$c = FactoryShape::create(4, 2);

var_dump($c->getArea());

// サークルオブジェクト

$o = FactoryShape::create(2);

var_dump($o->getArea());

ファクトリ パターンを使用すると、クラスとメソッドが 1 つしかないため、メソッドの呼び出しが簡単になります。ファクトリ パターンを使用しない場合は、呼び出し時にどのクラスとどのメソッドを呼び出すかを決定する必要があります。

ファクトリ パターンを使用すると、将来、アプリケーションに変更を加えるのも簡単になります。たとえば、シェイプのサポートを追加する場合は、ファクトリ クラスの create() メソッドを変更するだけです。ファクトリ パターンを使用しないでください。呼び出し元のコード ブロックを変更する必要があります。

3. オブザーバーモード

Observer パターンは、コンポーネント間の密結合を回避する別の方法を提供します。

パターンは非常に単純です。オブジェクトは、別のオブジェクト (オブザーバー) が自分自身を登録できるようにするメソッドを追加することで、自分自身を監視可能にします。

オブザーバブルが変更されると、登録されたオブザーバーにメッセージが送信されます。これらのオブザーバーは、この情報を使用して、監視可能なオブジェクトとは独立して操作を実行します。その結果、オブジェクトは理由を理解することなく相互に通信できるようになります。

簡単な例: リスナーがラジオを聞いているとき (つまり、ラジオが新しいリスナーに参加しているとき)、プロンプト メッセージが送信され、メッセージを送信したログ オブザーバーがこれを監視できます。

//オブザーバーインターフェース

インターフェース IObserver {

関数 onListen($sender, $args);

関数 getName();

}

// 観察可能なインターフェース

インターフェース IObservable {

関数 addObserver($observer);

関数removeObserver($observer_name);

}

//オブザーバークラス

抽象クラス Observer は IObserver {

を実装します

保護された $name;

パブリック関数 getName() {

$ this-> を返します。

}

}

// 観察可能なクラス

クラス Observable は IObservable {

を実装します

protected $observers = array();

パブリック関数 addObserver($observer) {

if (!($observerinstanceofIObserver)) {

戻る;

}

パブリック関数removeObserver($observer_name) {

foreach ($this->observers as $index => $observer) {

if ($observer->getName() === $observer_name) {

array_splice($this->observers, $index, 1);

}

}

// 観察できるクラスをシミュレートします: RadioStation

クラス RadioStation は Observable {

を拡張します

パブリック関数 addListener($listener) {

foreach ($this->オブザーバーを $observer として) {

$ observer-> onlisten($ this、$ listener);

}

}

// オブザーバークラスをシミュレートします

クラス RadioStationLogger は Observer {

を拡張します

protected $name = 'ロガー';

パブリック関数 onListen($sender, $args) {

echo $args, ' ラジオ局に参加してください。
';

}

}

// 別のオブザーバー クラスをシミュレートします

クラス OtherObserver は Observer {

を拡張します

protected $name = 'other';

パブリック関数 onListen($sender, $args) {

echo '他の観察者...
';

}

}

$rs = 新しい RadioStation();

//オブザーバーを注入

$rs->addObserver(new RadioStationLogger());

$rs->addObserver(new OtherObserver());

//オブザーバーを削除

$rs->removeObserver('other');

//観測情報が見られます

$rs->addListener('cctv');

http://www.bkjia.com/PHPjc/989816.html

tru​​ehttp://www.bkjia.com/PHPjc/989816.html技術記事 PHP デザイン パターン、いくつかのデザイン パターンの簡単な説明: 1. ファクトリ パターン ファクトリ パターンは、オブジェクトを作成するための特定のメソッドを持つクラスです。 ファクトリ クラスを使用してオブジェクトを作成できます...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!