ホームページ  >  記事  >  バックエンド開発  >  PHP でよく使用される 3 つのデザイン パターンに関する学習メモ

PHP でよく使用される 3 つのデザイン パターンに関する学習メモ

WBOY
WBOYオリジナル
2016-07-25 09:05:46805ブラウズ
  1. class SingetonBasic {

  2. private static $instance;

  3. // その他の変数..

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

  5. // コンストラクトを実行します..
  6. }

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

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

  9. if (!(self::$instance instanceof self)) {
  10. self::$instance = new self();
  11. }
  12. return self::$instance;
  13. }

  14. //その他の関数..

  15. }

  16. $a = SingetonBasic::getInstance();

  17. $b = SingetonBasic::getInstance();
  18. var_dump($a === $b);< ;/p>
コードをコピー

2. 工場出荷時モード ファクトリ パターンを使用すると、入力パラメーターまたはアプリケーション構成に基づいて他のクラスのインスタンスを実装して返すように特別に設計されたクラスを作成できます。 ファクトリーパターンの例:

  1. class FactoryBasic {
  2. public static function create($config) {

  3. }

  4. }

コードをコピー

たとえば、これは、渡されたパラメーターの数に基づいてさまざまな形状を作成することを目的とした形状オブジェクトを記述するファクトリです。

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

  2. interface IShape {
  3. function getCircum();
  4. function getArea();
  5. }

  6. // 長方形クラスを定義します

  7. class Rectangleimplements IShape {
  8. private $width, $height;< / p>
  9. public function __construct($width, $height) {

  10. $this->width = $width;
  11. $this->height = $height;
  12. }

  13. < ; p>public function getCircum() {
  14. return 2 * ($this->width + $this->height);
  15. }

  16. gt;public function getArea() {

  17. return $ this ->width * $this->height;
  18. }
  19. }

  20. // サークルクラスを定義します

  21. class Circleimplements IShape {
  22. private $radii;

  23. < ; p>public function __construct($radii) {
  24. $this->radii = $radii;
  25. }

  26. public function getCircum() {

  27. return 2 * M_PI * $this-> ; radii;
  28. }

  29. public function getArea() {

  30. return M_PI * pow($this->radii, 2);
  31. }
  32. }

  33. クラス FactoryShape {
  34. パブリック静的関数 create() {
  35. switch (func_num_args()) {
  36. ケース 1:
  37. return new Circle(func_get_arg(0));
  38. break;
  39. case 2:
  40. return new Rectangle(func_get_arg(0) ) ), func_get_arg(1));
  41. break;

  42. }

  43. }
  44. }

  45. // 長方形オブジェクト

  46. $c = FactoryShape::create( 4 , 2);
  47. var_dump($c->getArea());
  48. // 円オブジェクト
  49. $o = FactoryShape::create(2);
  50. var_dump($o->getArea());< / p>
コードをコピー

ファクトリ パターンを使用すると、クラスとメソッドが 1 つしかないため、メソッドの呼び出しが簡単になります。ファクトリ パターンを使用しない場合は、ファクトリ パターンを使用するときにどのクラスとどのメソッドを呼び出すかを決定する必要があります。将来、アプリケーションでの変更が容易になります。たとえば、ファクトリ クラスの create() メソッドを変更するだけで済みます。パターンを呼び出すコード ブロックを変更する必要があります。

3. オブザーバーモード Observer パターンは、コンポーネント間の密結合を回避する別の方法を提供します。パターンは非常に単純です。オブジェクトは、別のオブジェクト (オブザーバー) が自分自身を登録できるようにするメソッドを追加することで、自分自身を監視可能にします。監視可能なオブジェクトが変化すると、登録されたオブザーバーにメッセージが送信されます。これらのオブザーバーは、この情報を使用して、監視可能なオブジェクトとは独立して操作を実行します。その結果、オブジェクトは理由を理解することなく相互に通信できるようになります。

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

  1. // オブザーバーインターフェイス
  2. インターフェイス IObserver {
  3. function onListen($sender, $args);
  4. function getName();
  5. }

  6. < ;p>// オブザーバブルインターフェイス
  7. interface IObservable {
  8. function addObserver($observer);
  9. function RemoveObserver($observer_name);
  10. }

  11. // オブザーバークラス

  12. abstract class オブザーバーは IObserver を実装します {
  13. protected $name;

  14. public function getName() {

  15. return $this->name;
  16. }
  17. }

  18. // 監視可能なクラス

  19. class Observable は IObservable {
  20. protected $observers = array();

  21. public function addObserver($observer) {

  22. if (!($observerinstanceof IObserver)) {
  23. return;
  24. }
  25. $ を実装します。 this->observers[] = $observer;
  26. }

  27. public function RemoveObserver($observer_name) {

  28. foreach ($this->observers as $index = > $observer) {
  29. if ($observer->getName() === $observer_name) {
  30. array_splice($this->observers, $index, 1);
  31. return;
  32. }
  33. }
  34. }
  35. }

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

  37. class RadioStation extends Observable {

  38. public function addListener($listener) {

  39. foreach ($ this->observers as $observer) {
  40. $observer->onListen($this, $listener);
  41. }
  42. }
  43. }

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

  45. class RadioStationLogger extends Observer {
  46. protected $ name = 'logger';

  47. public function onListen($sender, $args) {

  48. echo $args, ' ラジオ局に参加します。
  49. }
  50. }< ;/p>
  51. // 別のオブザーバークラスをシミュレートします

  52. class OtherObserver extends Observer {
  53. protected $name = 'other';
  54. public function onListen($sender, $args) {
  55. echo '他のオブザーバー..< ;br/>';
  56. }
  57. }

  58. $rs = new RadioStation();

  59. // オブザーバーを注入します

  60. $rs->addObserver (new RadioStationLogger());
  61. $rs->addObserver(new OtherObserver());

  62. // オブザーバーを削除します

  63. $rs ->removeObserver('other');< /p>
  64. // 観測された情報が確認できます

  65. $rs->addListener('cctv');
  66. ?>
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。