PHP设计模式访问者模式
PHP设计模式——访问者模式
访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
UML类图:
角色:
1.抽象访问者(State):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
2.具体访问者(Success):实现访问者声明的接口。
3.抽象元素(Person):定义一个接受访问操作accept(),它以一个访问者作为参数。
4. 具体元素(Man):实现了抽象元素所定义的接受操作接口。
5.结构对象(ObjectStruct):这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
核心代码:
<span style="color:#000000;"><!--?php /** * Created by PhpStorm. * User:Jang * Date:2015/6/11 * Tim: 9 :40 */ /*男人这本书的内容要比封面吸引人;女人这本书的封面通常比内容更吸引人 男人成功时,背后多半有一个伟大的女人;女人成功时,背后多半有一个失败的男人 男人失败时,闷头喝酒,谁也不用劝;女人失败时,眼泪汪汪,谁也劝不了 男人恋爱时,凡事不懂也要装懂;女人恋爱时,遇事懂也要装作不懂*/ //抽象状态 abstract class State { protected $state_name; //得到男人反应 public abstract function GetManAction(VMan $elementM); //得到女人反应 public abstract function GetWomanAction(VWoman $elementW); } //抽象人 abstract class Person { public $type_name; public abstract function Accept(State $visitor); } //成功状态 class Success extends State { public function __construct() { $this--->state_name=成功; } public function GetManAction(VMan $elementM) { echo {$elementM->type_name}:{$this->state_name}时,背后多半有一个伟大的女人。 ; } public function GetWomanAction(VWoman $elementW) { echo {$elementW->type_name} :{$this->state_name}时,背后大多有一个不成功的男人。 ; } } //失败状态 class Failure extends State { public function __construct() { $this->state_name=失败; } public function GetManAction(VMan $elementM) { echo {$elementM->type_name}:{$this->state_name}时,闷头喝酒,谁也不用劝。 ; } public function GetWomanAction(VWoman $elementW) { echo {$elementW->type_name} :{$this->state_name}时,眼泪汪汪,谁也劝不了。 ; } } //恋爱状态 class Amativeness extends State { public function __construct() { $this->state_name=恋爱; } public function GetManAction(VMan $elementM) { echo {$elementM->type_name}:{$this->state_name}时,凡事不懂也要装懂。 ; } public function GetWomanAction(VWoman $elementW) { echo {$elementW->type_name} :{$this->state_name}时,遇事懂也要装作不懂。 ; } } //男人 class VMan extends Person { function __construct() { $this->type_name=男人; } public function Accept(State $visitor) { $visitor->GetManAction($this); } } //女人 class VWoman extends Person { public function __construct() { $this->type_name=女人; } public function Accept(State $visitor) { $visitor->GetWomanAction($this); } } //对象结构 class ObjectStruct { private $elements=array(); //增加 public function Add(Person $element) { array_push($this->elements,$element); } //移除 public function Remove(Person $element) { foreach($this->elements as $k=>$v) { if($v==$element) { unset($this->elements[$k]); } } } //查看显示 public function Display(State $visitor) { foreach ($this->elements as $v) { $v->Accept($visitor); } } }</span>
测试客户端代码:
header(Content-Type:text/html;charset=utf-8); //------------------------访问者模式-------------------- require_once ./Visitor/Visitor.php; $os = new ObjectStruct(); $os->Add(new VMan()); $os->Add(new VWoman()); //成功时反应 $ss = new Success(); $os->Display($ss); //失败时反应 $fs = new Failure(); $os->Display($fs); //恋爱时反应 $ats=new Amativeness(); $os->Display($ats);
适用场景及优势:
1) 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2) 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来定义在一个类中。
3) 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
4) 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

1. ファクトリ パターン: オブジェクト作成とビジネス ロジックを分離し、ファクトリ クラスを通じて指定された型のオブジェクトを作成します。 2. オブザーバー パターン: サブジェクト オブジェクトが状態の変化をオブザーバー オブジェクトに通知できるようにし、疎結合とオブザーバー パターンを実現します。

デザイン パターンは、再利用可能で拡張可能なソリューションを提供することで、コード メンテナンスの課題を解決します。 オブザーバー パターン: オブジェクトがイベントをサブスクライブし、イベントが発生したときに通知を受信できるようにします。ファクトリ パターン: 具象クラスに依存せずにオブジェクトを作成するための集中的な方法を提供します。シングルトン パターン: クラスには、グローバルにアクセス可能なオブジェクトの作成に使用されるインスタンスが 1 つだけ存在することが保証されます。

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

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

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

SpringMVC フレームワークは次の設計パターンを使用します: 1. シングルトン モード: Spring コンテナーを管理します。 2. ファサード モード: コントローラー、ビュー、およびモデルの対話を調整します。 3. ストラテジ モード: リクエストに基づいてリクエスト ハンドラーを選択します。 : アプリケーション イベントを公開し、リッスンします。これらの設計パターンは SpringMVC の機能と柔軟性を強化し、開発者が効率的で保守可能なアプリケーションを作成できるようにします。
