PHPデザインパターンデコレータ

PHPデザインパターンデコレータ

工場モデルはのは、いくつかの他のモデルを調べてみましょう、終わりが来ます。私は女性の大物は試していないのか分からないのですか?女性首長は、多くのプログラマヨーヨーを述べました。実際には、今日のようなデコレータその上にパターンとメイク。私はその後、元MM中のプログラムがある場合と信じている、とあなたはすぐにそれがデザインパターンをクリアすることができます。

GoFのクラス図と説明

装飾的な言葉は、私たちはメイクに彼を入れてみましょう。まず、あなたはその後、メイクの上に、メイクが仕事に行くために朝ことができ厚化粧がHi記入する際、あなたが働くことができる、そして、顔を持つようにベースを持っています。もちろん、農家はちょうど夜の試合の後半をキャッチするために仕事オフの時間にコードポイントです。とにかく、どんなにメイク、あなたの顔やあなたの顔は、他の誰かが知っていないに別の人物が存在しない場合があるが、これは確かにあなたの顔です。これには、顔の表情が良い(増加義務)という、オブジェクトのデコレータ(顔)、様々な装飾(メイクアップ)です。

GoFの定義:動的にサブクラスよりも柔軟性が高い機能、Decoratorパターン生成のために、オブジェクトに追加の責任を追加します

図クラスのGoF

 

 

コードの実装
interface Component{
    public function operation();
}

class ConcreteComponent implements Component{
    public function operation(){
        echo "I'm face!" . PHP_EOL;
    }
}

私たちは顔それと見られ、特定のカテゴリを置く非常にシンプルなインターフェイスと実現、!

abstract class Decorator implements Component{
    protected $component;
    public function __construct(Component $component){
        $this->component = $component;
    }
}

抽象デコレータクラス実装するコンポーネントのインターフェースでなく、サブクラスを達成するように、操作()メソッドを実装していません。ここでは主なCompoNetを、彼は飾ることのための意思への参照が必要であるセーブ。上記の特定のクラスに対応するには、我々はそれに顔のメイクアップの準備が整いました!

class ConcreteDecoratorA extends Decorator{
    public $addedState = 1; // 没什么实际意义的属性,只是区别于ConcreteDecoratorB

    public function operation(){
        echo $this->component->operation() . "Push " . $this->addedState . " cream!" . PHP_EOL;
    }
}
class ConcreteDecoratorB extends Decorator{
    public function operation(){
        $this->component->operation();
        $this->addedBehavior();
    }

    // 没什么实际意义的方法,只是区别于ConcreteDecoratorA
    public function addedBehavior(){
        echo "Push 2 cream!" . PHP_EOL;
    }
}

2つの特定のデコレータ。ここで私はすべての後に、二回クリームを塗っ、この事は本当に理解していないメイクに純粋な男、です。最初のステップは、まず土台のように、右を戦うためにすべき?しかし、この方法では、我々は両方の実現デコレータは、クリームの2つのコートに直面することです。

  • コードからわかるように、我々は、包装にConcreteComponentの具体的な目標となっています
  • さらにダウンし、その後、我々は彼の運転に実際にある()このメソッドは、毎回二回ラップに基づいて、前のプラス少し何か
  • 追加されたプロパティとAとBデコレータのメソッドに苦労しないでください、彼らはちょうどGoFのクラス図ではなく、同じことを2つのデコレータを区別するために使用され、すべてのデコレータは、他のものの多くは、コンポーネントオブジェクトを行うことができませんのみ、特定の操作()このように、我々はすべての方法の選択装飾オブジェクトまたは一部を行くことができます
  • 私たちは、これが楽にやってください、直接のサブクラスは、ライン上のすべての方法を書き換えません、コンポーネントを継承しているように見えますか?プロ、下ヨーヨーの組み合わせの概念を理解し、我々デコレーターの親クラスが自身をデカップリングああ、ああ、実際のオブジェクトへの参照である、我々は唯一の真のオブジェクトパッケージのためにそれを行うには、直接デコレータを直接インスタンス化することはできません
  • それとも、理解していませんでしたか?グッドは、それを何ですか?旧クラスのシステムは、ああ、ああ、あなたはメソッドだけで変更をあえて?あなたはかつての牛への書き込みに必要な新機能、多分驚異の(S)力(B)符号拡張する場合、この株式デコレータをお試しください!

電話このようなものを乾燥したが、一部の米、いくつかのOは、一定で、我々はよく、と遊ぶことができない、それに集中するバディの電話シェル!ああ、私が最初に透明のシェル(コンポーネント)を用意し、貧しい人に語った少し醜い、決して、ように見えます。メートルプラスソリッドカラー(DecoratorA1)の様々な、それをバック(DecoratorB1)に印刷され、さまざまな色を植える;流れのように見える最近の携帯電話でのOが大幅に裏書し、その後、私はシェルの様々な彼の携帯電話を与えます明るい色(DecoratorA2)と漫画の絵(DecoratorB2)のスター、最後の一つは、携帯電話のような業界をリードし始めている、であり、この事をヒットする屏風は、携帯電話のシェルの事を販売する私のビジネスではありません!さて、あなたは兄弟、あるいは私と一緒にいくつかのご飯、混合O Go]を与えていません!

完全なコード:デコレーター

テキストメッセージを送信し続け、我々は複数のSMS事業者の問題を解決する前に、工場出荷時のパターンを使用しています。今回は、問題のメッセージのコンテンツテンプレートを解決する必要があります。SMS推進クラスの場合、最新の広告の法則によると、我々はありません「最初の国では、」と、当然のことながら、いくつかのあまり文明言語は、我々はまた、言葉の種類、使用することはできません「世界初の。」

現在の状況は、我々は、古いシステムが内部スタッフが直面している、より少ない言語コンテンツに要求している、の内容が固定されており、古いシステムがまだこのテンプレートを使用している長いSMSの前にテンプレートクラスを持っているようなものです。新システムは、内部および外部のユーザーが送信されるように、あるネットワーク全体に送信する必要があります。現時点では、メッセージテンプレート、古いシステムのパッケージにDecoratorパターンを使用することができます。実際には、単純なポイントことを、私たちは、テキスト置換機能を実行するデコレータです。グッドは、それを何ですか?もちろん、私たちは古いテンプレートやその他のコンテンツの変更された拡張を実現するために、クラスに元のテンプレート方式を変更することはできません。

図SMSクラス

 

 

完全なソースコード:SMSデコレータ方法

<?php
// 短信模板接口
interface MessageTemplate
{
    public function message();
}

// 假设有很多模板实现了上面的短信模板接口
// 下面这个是其中一个优惠券发送的模板实现
class CouponMessageTemplate implements MessageTemplate
{
    public function message()
    {
        return '优惠券信息:我们是全国第一的牛X产品哦,送您十张优惠券!';
    }
}

// 我们来准备好装饰上面那个过时的短信模板
abstract class DecoratorMessageTemplate implements MessageTemplate
{
    public $template;
    public function __construct($template)
    {
        $this->template = $template;
    }
}

// 过滤新广告法中不允许出现的词汇
class AdFilterDecoratorMessage extends DecoratorMessageTemplate
{
    public function message()
    {
        return str_replace('全国第一', '全国第二', $this->template->message());
    }
}

// 使用我们的大数据部门同事自动生成的新词库来过滤敏感词汇,这块过滤不是强制要过滤的内容,可选择使用
class SensitiveFilterDecoratorMessage extends DecoratorMessageTemplate
{
    public $bigDataFilterWords = ['牛X'];
    public $bigDataReplaceWords = ['好用'];
    public function message()
    {
        return str_replace($this->bigDataFilterWords, $this->bigDataReplaceWords, $this->template->message());
    }
}

// 客户端,发送接口,需要使用模板来进行短信发送
class Message
{
    public $msgType = 'old';
    public function send(MessageTemplate $mt)
    {
        // 发送出去咯
        if ($this->msgType == 'old') {
            echo '面向内网用户发送' . $mt->message() . PHP_EOL;
        } else if ($this->msgType == 'new') {
            echo '面向全网用户发送' . $mt->message() . PHP_EOL;
        }

    }
}

$template = new CouponMessageTemplate();
$message = new Message();

// 老系统,用不着过滤,只有内部用户才看得到
$message->send($template);

// 新系统,面向全网发布的,需要过滤一下内容哦
$message->msgType = 'new';
$template = new AdFilterDecoratorMessage($template);
$template = new SensitiveFilterDecoratorMessage($template);

// 过滤完了,发送吧
$message->send($template);
説明
  • 最大の利点のデコレータ:1は、元のコードを変更しない元のコード例内容、スケーラブル、オープンクローズ原則、2番目は、すべてのデコレータでその機能を完了し、単一責任;第三の組み合わせを使用することです気持ちを継承。
  • 以下のための理想的な:古いシステムを拡張します
  • 注意してください:あまりにも多くのデコレータあなたはハローに係合します
  • 必ずしも装飾のと同じ方法でされていない、実際には、デコレータは、より多くの装飾オブジェクトの、オブジェクトはここで拡張され、我々は、すべてのメソッドの出力のための、唯一のこの記事のために装飾されているべきである、デコレータ実際には、より広範なアプリケーション
  • そうでない場合、それは装飾的なオブジェクトの前ではなく、新しいオブジェクト、同じ抽象データを返すことで、同じ動作特性を有する、このようなメリットをオブジェクト、デコレータは、すべてのプライマリインターフェイスまたはクラスから継承されています
  • BufferInputStreamのFileInputStream、LineNumberInputStream、:それを理解するのは難しいビットは関係ありません、私たちは、このデザインパターンは、Java-Iこのデザインパターンで使用されている/ Oシリアルインタフェースの「ヘッドファーストデザインパターン」に言及した。この例は非常に不本意ながら実際にしています待機
  • :Laravelフレームワークミドルウェアパイプラインは、実際には、ここでもDecoratorパターンに適用される様々なモードの包括的なアプリケーションであるパイプライン分析ソースミドルウェアDecoratorパターン- Laravel HTTP
  • またLaravelに、ここでの処理のログもモノローグが装飾されている、興味のある学生は、次を見つけるために行くことができます
公開された41元の記事 ウォンの賞賛6 ビュー50000 +

おすすめ

転載: blog.csdn.net/bujidexinq/article/details/104964458
おすすめ