PHPデコレーター
1. Decoratorパターンとは何ですか?
定義:その構造を変更せずに、既存のオブジェクトに新しい機能を可能にします。デザインパターンのこのタイプは、それが従来のクラスとしてパッケージ化され、構造モデルに属します。
つまり、あなたは、単に動的などの機能を追加および変更することができます
2.なぜ、Decoratorパターンを使用できますか?
クラスが機能を提供している場合は、今の追加機能を従来のプログラミングモデルを変更または追加する必要があるクラスのメソッドを、それを統合し、再実装するサブクラスを記述する必要があります。ただ、装飾的なパターンを用いて実現することができ、実行時に装飾的なオブジェクトを追加します。
このパターンは、元のクラスをラップするために使用される装飾を作成し、追加機能を提供する前提の下で署名の完全性を維持するために、クラスメソッド
3利点、Decoratorパターン
- 私たちは、発生による過剰なレベルに混乱の種類を保証することはできません。
- 元のデータ構造を変更することなく、我々のニーズに非常に時間を変更する場合。
図3に示すように、サンプルコード
/ * * * @Purposeレンダリンググラフィックプリミティブクラス *クラスキャンバス * / クラスCanvasOld { / * * * @varデータがアレイ内に描画される * / パブリック $データ; / * * 充填の初期化:* @purpose * * @param int型$幅パターン示さ幅 * @param INT $高いハイトパターン描か * / パブリック 関数のinit($幅 = 20であり、$ハイ = 10 ) { ため($ I = 0; $ I < $幅 ; $ I ++ ) { のために($ jを = 0; $ jの < $高い ; $のJ ++ ) { $この - >データ[ $ I ] [ $のJ ] = '*' 。 } } } / * * * @purpose:绘制图形 * / パブリック 関数ドロー() { foreachの($この - >データとして $線) { foreachの($ライン として $ CHAR ) { エコー $ CHAR 。 } エコー '</ BR>' ; } } } / * * * @purpose:デコレータインタフェースクラス *インタフェースDrawDecorator * / インターフェースDrawDecorator { / * * メソッド前に混合* @return描画を開始 * / パブリック 関数BeforeDraw()。 / * * * @return混合延伸後メソッド開始 * / パブリック 関数AfterDraw(); } / * * * @purpose:色デコレータ *クラスColoerDecorator * / クラスを ColoerDecorator 実装 DrawDecorator { / * * * @var文字色 * / パブリック $カラー、 公共 機能 __construct($カラー = '赤' ) { $この - >色= $カラー; } / * * メソッド* @return描画を開始する前に混合 * / 公共 機能BeforeDraw() { エコー "<divのスタイル= '色:{ $この - >色}'>" ; } / * * * @return混合延伸後のメソッドを開始 * / 公共の 機能AfterDrawを() { エコー'</ div>' ; } } / * * * @Purpose:フォントサイズデコレータ *クラスFontSizeDecorator * / クラス FontSizeDecorator 実装はDrawDecorator { / * * * @var文字列のフォントサイズ * / パブリック $のfontSize 、 パブリック 関数 __construct($カラー = '赤' ) { この$ - >のfontSize = $カラー; } / * * * @return混合描画を開始する従来の方法 * / パブリック 関数BeforeDraw() { エコー"<divのスタイル= 'フォントサイズ:{ $この - >のfontSize}'>" ; } / * * *スタート法混合@return延伸後 * / 公共の 機能AfterDrawを() { エコー '</ DIV>' ; } } / * * * @purpose:装飾的なグラフィック描画クラスの添加後に *クラスキャンバス * / クラスキャンバス { / * * * @var格納されたデータは、アレイプロットされる * / パブリック $データ; / * * * @var装飾されたオブジェクトの追加配列の配列保存 * / 公共 の$ _decoratorsを; / * * * @Purpose:充填*の初期 幅描か* @param INT $幅パターン * @param INT $高い高示さパターン * / パブリック 関数のinit($幅 = 20、である$ハイ = 10 ) { 用($ I = 0; $ Iは < $幅、$ I ++ ) { ため($ J = 0; $ J < $ハイ ; $ J ++ ) { $この - >データ[ $ I ] [ $ J ] = '*' ; } } } / * * * @Purpose:グラフィックスの描画 * / パブリック 関数ドローを() { $この - > BeforeDraw(); // デコレータを呼び出し ますforeach($この - >データAS $ライン) { foreachの($ライン AS $チャー) { エコー $チャー; } エコー '</ BR>' ; } $この - > AfterDraw(); // デコレータを呼び出します } / * * * @purpose:追加デコレータ @param DrawDecoratorデコレータ$ * * / パブリック 関数 addDecorator(DrawDecorator $デコレータ) { $この - > _デコレータ[] = $デコレータ; } / * * * @purpose:描画を開始する前に * / パブリック 関数BeforeDraw() { foreachの($この - > _デコレータAS $デコ) { $デコレータ - > BeforeDraw(); } } / * * * @purpose:スタート延伸後 * / 公共 機能AfterDraw() { // AfterDrawは、通話の反対を必要としています。 $デコレータ = array_reverse($この - > _decorators); foreachの($デコレータ AS $デコレータ) { $デコレータ - > AfterDraw(); } } } $カヴァ = 新しい新しいキャンバス(); $カヴァ - > addDecorator(新しい新しい ColoerDecorator() ); // 色のデコレータを追加します // $ cavas-> addDecorator(新しいFontSizeDecorator ()); // クラスのクラスは、機能をカプセル化し、必要に応じて追加することができます $カヴァ- >ドロー();
この記事では再現した場合に、カンガルーの学習をまとめたソース明記してください:https://www.cnblogs.com/chrdai/p/11184510.htmlを