ホームページ  >  記事  >  バックエンド開発  >  PHPデコレータパターンの詳細説明

PHPデコレータパターンの詳細説明

小云云
小云云オリジナル
2018-02-09 09:25:422008ブラウズ

デコレーターモードデコレーターモードとも呼ばれます。デコレーション モードは、元のクラス ファイルを変更したり継承を使用したりすることなく、オブジェクトの機能を動的に拡張します。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。この記事では、主に PHP デザイン パターンのデコレータ パターンを皆さんに紹介します。デコレータ パターンの概念と機能を簡単に紹介し、PHP の実装とデコレータ パターンの使用に関する関連する操作スキルを例の形式で詳細に分析します。必要な方は参考にしていただければ幸いです。

UML クラス図:

役割:

コンポーネントオブジェクトのインターフェース: これらのオブジェクトに責任を動的に追加できます
すべてのデコレータの親クラス: そうする必要がある定義済み コンポーネント インターフェイスと一致し、実際には装飾されたオブジェクトである Component オブジェクトを保持するインターフェイス。
特定のデコレータークラス: 装飾されたオブジェクトに追加される特定の関数を実装します。特定のコンポーネント オブジェクトまたは別の特定のデコレータ オブジェクトを装飾するために使用されます。

特定のコード:


<?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/5/3
 * Time: 11:11
 */
/**组件对象接口
 * Interface IComponent
 */
interface IComponent
{
  function Display();
}
/**待装饰对象
 * Class Person
 */
class Person implements IComponent
{
  private $name;
  function __construct($name)
  {
    $this->name=$name;
  }
  function Display()
  {
    echo "装扮的:{$this->name}<br/>";
  }
}
/**所有装饰器父类
 * Class Clothes
 */
class Clothes implements IComponent
{
  protected $component;
  function Decorate(IComponent $component)
  {
    $this->component=$component;
  }
  function Display()
  {
    if(!empty($this->component))
    {
      $this->component->Display();
    }
  }
}
//------------------------------具体装饰器----------------
class PiXie extends Clothes
{
  function Display()
  {
    echo "皮鞋 ";
    parent::Display();
  }
}
class QiuXie extends Clothes
{
  function Display()
  {
    echo "球鞋 ";
    parent::Display();
  }
}
class Tshirt extends Clothes
{
  function Display()
  {
    echo "T恤 ";
    parent::Display();
  }
}
class Waitao extends Clothes
{
  function Display()
  {
    echo "外套 ";
    parent::Display();
  }
}

クライアントテストコードを呼び出す:


header("Content-Type:text/html;charset=utf-8");
//------------------------装饰器模式测试代码------------------
require_once "./Decorator/Decorator.php";
$Yaoming=new Person("姚明");
$aTai=new Person("A泰斯特");
$pixie=new PiXie();
$waitao=new Waitao();
$pixie->Decorate($Yaoming);
$waitao->Decorate($pixie);
$waitao->Display();
echo "<hr/>";
$qiuxie=new QiuXie();
$tshirt=new Tshirt();
$qiuxie->Decorate($aTai);
$tshirt->Decorate($qiuxie);
$tshirt->Display();

適用可能なシナリオ:

1 関数を動的に追加する必要があります。これらの関数をオブジェクトに適用します。動的に元に戻すことができます。

2. いくつかの基本関数の順列と組み合わせによって生成される非常に多くの関数を追加する必要があり、継承関係が非現実的になります。

3. サブクラスの生成方法が拡張に使用できない場合。場合によっては、多数の独立した拡張機能があり、それぞれの組み合わせをサポートするために多数のサブクラスが生成され、サブクラスの数が爆発的に増加することがあります。別のケースとしては、クラス定義が非表示になっているか、クラス定義を使用してサブクラスを生成できないことが考えられます。

関連おすすめ:

PHPデザインパターンのデコレータパターンを詳しく解説

JavaScriptのデコレータパターンをphpやpythonと比較して詳しく解説

デコレータに関するおすすめ記事

以上がPHPデコレータパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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