まず、装飾的なパターンは何ですか
- スキーマ定義
デコレータは、この方法は、完全に新しい機能デコレータサブクラスを追加するために、独自の方法を呼び出すために参照され、すべてのインターフェイスおよび参照がデコレーターですが含まれています。
カテゴリはDecoratorパターンのみ適用される特別なシーンを満たしていない、この方法は、オブジェクトを飾った書き換え、または装飾のオブジェクトの振る舞いを変更しないでください。分類は、メソッドおよびプロパティデコレータクラス拡張のために主に使用され
- 需要シナリオ
静的ライブラリの拡張。(元のクラス)、無継承、動的な拡張を変更しません。
- 私は唯一のインタフェース、動的な拡張を提供し、元のクラスの実装の詳細を知りません。
- 私は、継承の方法で機能を追加したくない、より多くのサブクラスを持っている必要はありません。
- オブジェクト関数の動的拡張。
- オブジェクトへの参照を保持しなければならない飾られているクラスのインスタンスが含まれています。
第二に、装飾的なパターンの構成図
実装:
- デコレータは、定義され、そしてすべての方法は.Hデコレータクラスに.H雨水管(操作方法は、追加するようにカスタマイズされてもよい)、クラスデコレータを参照して定義されています。
- デコレータオブジェクトがそのメソッドを呼び出すと、それは出力に、我々はデコレータのクラスで必要な結果を持っています。
- あなたはデコレータを拡張したい場合は、デコレータネイティブロジックを破壊することができない方法により分類しました。
第三に、サンプル・コード
- ターゲット(デコ)
- Target.h
ターゲット@interface:NSObjectの / * * *コインの数 * / @Property(非アトミック、ASSIGN)NSInteger COIN; / * * *垂直方向と水平方向の操作 * / - (ボイド)まで; - (ボイドダウン); - (ボイド)左; - (ボイド)右; / * * スタート選択*操作 * / - (ボイド)を選択し、 - (ボイド)開始; / * * *の操作ボタン+ B * / - (ボイド)Commanda。 - (無効)commandB; @end
- Target.m
@implementationターゲット - (無効)アップ{ のNSLog(@ " アップ" ); } - (ボイド){ダウン のNSLog("@ ダウン" )。 } - (ボイド){左 のNSLogは(@ " 左" )。 } - (ボイド){右 のNSLog("@ 右" )。 } - (ボイド)を選択し、{ のNSLog("@ 選択" )。 } - (無効)開始{ のNSLog(@ " 開始" )。 } - (ボイド)commandA { のNSLog(@ " commandA " )。 } - (ボイド)commandB { のNSLog(@ " commandB " )。 } @end
- Target.h
- デコレータ(デコレータ)
- Decorator.h
#import <財団/ Foundation.h> NS_ASSUME_NONNULL_BEGIN デコレータ@interface:NSObjectの に#pragmaマーク-方法デコレータ @Property(非アトミック)NSInteger COIN; - (無効)アップ; - (無効)ダウン; - (無効)、左; - (無効)右; - (無効)SELECT ; - (無効)スタート; - (無効)Commanda; - (無効)commandB; の#pragmaマーク-以下は、装飾的な機能新しく追加されたオブジェクトである/ * * いくつか残っています*コマンド* / @Property(非アトミック、 読み取り専用)NSInteger生活; / * * * ABABについて垂直方向に上下(カンニング) * / - (無効)チート; @end
- Decorator.m
#importを" Decorator.h " の#import " Target.h " デコレータ@interface() @Property(強い、非アトミック)ターゲットをターゲット; //はデコレータクラスオブジェクト保持 @endの @implementationデコレータ の#pragmaマーク-初期化 - (instanceType)INIT { IF(自己= [スーパーINIT]){ // 装飾オブジェクトは、実際のオブジェクトへの参照含ま [ターゲットself.target = 新しい新規]; } 戻り自己; } の#pragmaマーク-実際のオブジェクトは、実行基準に対応させ方法 - (ボイド){アップ [UP _target]; } - (ボイド)ダウン{ [ダウン_target]。 } - (ボイド){左 [_target左側]。 } - (ボイド)右{ [_target右]。 } - (ボイド)を選択し、{ [_target 選択]。 } - (ボイド)開始{ [開始_target]。 } - (ボイド)commandA { [_target commandA]。 } - (ボイド)commandB { [_target commandB]。 } の#pragmaマーク-装饰器新添加的方法 - (無効)カンニング{ [アップ_target]。 【ダウン_target]。 【アップ_target]。 【ダウン_target]。 【_target左側]。 【_target右]。 【_target左側]。 【_target右]。 【_target commandA]。 【_target commandB]。 【_target commandA]。 【_target commandB]。 } @synthesize在住 =の_livesと、 - (NSInteger)が住ん{ // 相关处理逻辑 返す 10 。 } @end
- Decorator.h
第四に、装飾的なパターンの長所と短所
- アドバンテージ
ビジネスロジックを変更することなく、特定のクラスの場合、および機能は、既存の方法を拡大します
五,demo
Decoratorパターン