パターン自体の概念については、インターネット上の他の記事を参照してください
ここでは、PHPの実際の開発プロセスでの適用のみを説明します
このパターンの適用範囲は非常に限られています適用可能なシナリオ:
1. 適用可能 プロジェクトのメンテナンス プロセスには適していますが、プロジェクト開発プロセスには適用されません
2. 新しい要件では、1 つ以上の同じ/類似のメソッドを 1 つ以上のクラスに追加する必要があります
3 . オリジナルのコードを変更したり拡張したりすることはできません
4. オリジナルのクラスは、このモード用に用意されたインターフェイスを予約しています
上記、製品のメンテナンス中に 3 と 4 が同時に表示されることは困難です。要件:
1. 同じ親クラスに属する、または異なる親クラスに属するオブジェクトのグループは、特定のデータ構造を使用してデータ セットを形成します。ここでのデータ構造は、概念的なキュー、スタック、セット、ツリーです。 、グラフ、または実際の 1 次元または多次元配列 (走査できる限り)
2. オブジェクトのグループ全体を走査するときに、同じ名前が使用されるように、プロジェクトで操作を追加する必要があります。
実装プロセス:
1. 元のコードでは、上記のオブジェクトは Class に属しており、accept (奇妙な名前)
Class ElementA{
と呼び出すことができる拡張インターフェイスが事前に予約されています。
public function accept(VisitorBase $v){$v->visitA($this);
}
}
class ElementB{
public function accept(VisitorBase $v){
$v- >visitB($this);
}
}
上記によると、もちろん事前に定義する必要があります VisitorBase の抽象インターフェイス
インターフェイス VisitorBase {
function visitA(ElementA $eleA) ;
function visitB(ElementB $eleB);
}
2. 新しいコードでは、新しい操作のための新しい操作を作成します。クラスは VisitorX (visitor、別の操作がある場合は別の奇妙な名前) と呼ばれます。 VisitorY として定義できます。どちらも VisitorBase インターフェイスを実装します
class VisitorXimplements VisitorBase{
public function visitA(ElementA $eleA){
//ここで、要素 A のメソッドにアクセスして特定のトランザクションを処理できます
$eleA->someFunc();
}
public function visitB(ElementB $eleB){
…
}
}
3. 新しいコードでは、配列を取得してトラバースできます。例として (これが最も一般的に使用されます)
$x=new VisitorX;
foreach($elementArray as $element){
$element-> ;accept($x);
}
上記は、すべての要素 (同じ親クラスに属しているかどうかに関係なく) を走査し、各要素の VisitorX クラスで対応する操作を実行します。
1. 元のコードはなぜですか。変更は許可されていません
2. 元のコードを変更しないのであれば、それを継承してメソッドを拡張させてはどうでしょうか?
4. 同じ機能を実現する他の方法がある限り、この設計パターンを使用しないようにしてください。これにより、同じオブジェクトのオペレーション コードが異なる場所に分散することになります。プログラム内で、これ以上のメンテナンスには役立たないため、変更を加えます。
可能 5. 代替実装方法を検討します:
A. 元のクラスを変更し、同じ名前のメソッドを追加します
B. 元のクラスを展開 (継承) 、同じ名前のメソッドを追加します。異なるクラスの同じ操作のコードをまとめるには、 Trait
を検討してください。