戦略パターン
戦略パターンはオブジェクトの動作パターンであり、一連のアルゴリズムをカプセル化することを目的としています。 。必要なアルゴリズムを動的に選択して使用します。
ストラテジモードとは、プログラムにおける意思決定制御を伴うモードを指します。この設計パターン自体の核となるアイデアはオブジェクト指向プログラミングのポリモーフィックなアイデアであるため、戦略パターンは非常に強力です。
戦略モードの 3 つの役割:
1.抽象的な戦略の役割
2.具体的な戦略的役割
3.環境の役割 (抽象的な戦略の役割への参照)
実装手順:
1.抽象ロール クラスを定義します (実装ごとに共通の抽象メソッドを定義します)
2.特定のストラテジークラスを定義します(親クラスの共通メソッドを具体的に実装します)
3.環境ロール クラスを定義する (抽象ロール変数をプライベートに宣言し、コンストラクターをオーバーロードし、抽象メソッドを実行する)
プログラミングの分野のすぐ外にも、Strategy パターンの例が多数あります。例:
朝、家から仕事に行く必要がある場合、いくつかの戦略を検討できます。地下鉄に乗る、バスに乗る、徒歩などの方法があります。各戦略は同じ結果を達成しますが、使用するリソースは異なります。
ストラテジ パターンのコード例:
<?phpabstract class baseAgent { //抽象策略类 abstract function PrintPage(); } //用于客户端是IE时调用的类(环境角色) class ieAgent extends baseAgent { function PrintPage() { return 'IE'; } } //用于客户端不是IE时调用的类(环境角色) class otherAgent extends baseAgent { function PrintPage() { return 'not IE'; } } class Browser { //具体策略角色 public function call($object) { return $object->PrintPage (); } } $bro = new Browser (); echo $bro->call ( new ieAgent () ); ?>
ファクトリ パターン
ファクトリ パターンは、最も一般的に使用されるインスタンス化オブジェクト パターンです。は、ファクトリ メソッドを使用して新しい操作を置き換えるモードです。
ファクトリ パターンを使用する利点は、インスタンス化されたクラス名などを変更したい場合に、ファクトリ メソッドの内容を変更するだけで済み、特定のインスタンス化を見つける必要がないことです。コード内の箇所 ( new ) が 1 つずつ変更されます。システム構造に柔軟な動的拡張メカニズムを提供し、結合を軽減します。
<?php header('Content-Type:text/html;charset=utf-8'); /** *简单工厂模式(静态工厂方法模式) */ /** * Interface people 人类 */ interface people { public function say(); } /** * Class man 继承people的男人类 */ class man implements people { // 具体实现people的say方法 public function say() { echo '我是男人<br>'; } } /** * Class women 继承people的女人类 */ class women implements people { // 具体实现people的say方法 public function say() { echo '我是女人<br>'; } } /** * Class SimpleFactoty 工厂类 */ class SimpleFactoty { // 简单工厂里的静态方法-用于创建男人对象 static function createMan() { return new man(); } // 简单工厂里的静态方法-用于创建女人对象 static function createWomen() { return new women(); } } /** * 具体调用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();
シングル ケース モード
シングル ケース モードでは、クラスのインスタンスが 1 つだけ存在することが保証され、クラス自体がインスタンス化されてこのインスタンスが提供されます。システム全体に。
シングルトン モードは一般的な設計パターンであり、コンピュータ システムでは、スレッド プール、キャッシュ、ログ オブジェクト、ダイアログ ボックス、プリンタ、データベース操作、グラフィック カード ドライバがシングルトンとして設計されることがよくあります。
シングルトン モードには、遅延スタイル シングルトン、ハングリー スタイル シングルトン、および登録スタイル シングルトンの 3 種類があります。
シングルトン モードには次の 3 つの特徴があります。
1.インスタンスは 1 つだけ存在できます。
2.このインスタンスは自分で作成する必要があります。
3.このインスタンスは他のオブジェクトに提供する必要があります。
それでは、なぜ PHP シングルトン モードを使用するのでしょうか?
PHP の主要なアプリケーション シナリオの 1 つは、アプリケーションがデータベースを扱うシナリオです。アプリケーションでは、多数のデータベース操作が発生します。データベース ハンドルをデータベースに接続する動作については、 、シングルトン モードを使用すると、多数の新しい操作を回避できます。新しい操作が行われるたびにシステム リソースとメモリ リソースが消費されるためです。
class Single { private $name;//声明一个私有的实例变量 private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。 } static public $instance;//声明一个静态变量(保存在类中唯一的一个实例) static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象 if(!self::$instance) self::$instance = new self(); return self::$instance; } public function setname($n){ $this->name = $n; } public function getname(){ return $this->name; } } $oa = Single::getinstance(); $ob = Single::getinstance(); $oa->setname('hello world'); $ob->setname('good morning'); echo $oa->getname();//good morning echo $ob->getname();//good morning
登録モード
登録モードは、グローバル共有とオブジェクト交換を解決します。作成されたオブジェクトはグローバルに使用可能な配列上に保持され、必要に応じて配列から直接取得できます。オブジェクトをグローバルツリーに登録します。どこへでも直接訪問してください。
<?php class Register { protected static $objects; function set($alias,$object)//将对象注册到全局的树上 { self::$objects[$alias]=$object;//将对象放到树上 } static function get($name){ return self::$objects[$name];//获取某个注册到树上的对象 } function _unset($alias) { unset(self::$objects[$alias]);//移除某个注册到树上的对象。 } }
アダプター パターン
さまざまな完全に異なる機能インターフェイスを統合 API にカプセル化します。
PHP には MySQL、MySQLi、PDO の 3 つのデータベース操作があり、アダプター モードを使用して統合できるため、異なるデータベース操作を同じ API に統合できます。同様のシナリオには、memcache、redis、file、apc などのさまざまなキャッシュ機能を一貫したものに統合できるキャッシュ アダプターが含まれます。
最初にインターフェイスを定義します (いくつかのメソッドと対応するパラメーターを使用)。次に、いくつかの異なる状況がある場合は、インターフェースを実装するためのいくつかのクラスを作成するだけです。同様の機能を実行する機能を一貫したメソッドに統合します。
#接口 IDatabase <?php namespace IMooc; interface IDatabase { function connect($host, $user, $passwd, $dbname); function query($sql); function close(); }
MySQL
<?php namespace IMooc\Database; use IMooc\IDatabase; class MySQL implements IDatabase { protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = mysql_connect($host, $user, $passwd); mysql_select_db($dbname, $conn); $this->conn = $conn; } function query($sql) { $res = mysql_query($sql, $this->conn); return $res; } function close() { mysql_close($this->conn); } }
MySQLi
<?php namespace IMooc\Database; use IMooc\IDatabase; class MySQLi implements IDatabase { protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = mysqli_connect($host, $user, $passwd, $dbname); $this->conn = $conn; } function query($sql) { return mysqli_query($this->conn, $sql); } function close() { mysqli_close($this->conn); } }
オブザーバー パターン
1: オブザーバー パターン (オブザーバー) 、オブジェクトの状態が変化すると、そのオブジェクトに依存するすべてのオブジェクトが通知され、自動的に更新されます。
2: シナリオ: イベントの発生後、一連の更新操作を実行する必要があります。従来のプログラミング方法は、イベント コードの直後に処理ロジックを追加することです。更新されるロジックが増えると、コードの保守が困難になります。このメソッドは結合されており侵入的であるため、新しいロジックを追加するにはイベントのメイン コードを変更する必要があります。
3: オブザーバー パターンは、結合度が低く、非侵入的な通知および更新メカニズムを実装します。
イベント トリガーの抽象クラスを定義します。
EventGenerator.php <?php require_once 'Loader.php'; abstract class EventGenerator{ private $observers = array(); function addObserver(Observer $observer){ $this->observers[]=$observer; } function notify(){ foreach ($this->observers as $observer){ $observer->update(); } } }
オブザーバー インターフェイスの定義
Observer.php <?php require_once 'Loader.php'; interface Observer{ function update();//这里就是在事件发生后要执行的逻辑 } //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件
実装:
require 'Loader.php'; class Event extends EventGenerator{ function triger(){ echo "Event<br>"; } } class Observer1 implements Observer{ function update(){ echo "逻辑1<br>"; } } class Observer2 implements Observer{ function update(){ echo "逻辑2<br>"; } } $event = new Event(); $event->addObserver(new Observer1()); $event->addObserver(new Observer2()); $event->triger(); $event->notify();
関連する推奨事項:PHP チュートリアル
以上が5 つの一般的な PHP 設計パターンの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。