デコレーターパターンは、オブジェクトにいくつかの追加の責任を動的に追加できます。機能を追加するという点では、デコレーターモードはサブクラスを生成するよりも柔軟です。
このモードに該当する環境は次のとおりです。
(1)他のオブジェクトに影響を与えることなく、動的で透明な方法で単一のオブジェクトに責任を追加します。
(2)取り消される可能性のある責任を処理する。
(3)サブクラスを生成する方法を拡張に使用できない場合。シナリオの1つは、多数の独立した拡張機能がある可能性があり、各組み合わせをサポートするために多数のサブクラスを生成し、サブクラスの数を爆発させることです。別のケースは、クラスの定義が非表示になっているか、クラス定義を使用してサブクラスを生成できないためです。
このモードを実装するための重要なステップ:
(1)コンポーネント(装飾されたオブジェクトのベースクラス):オブジェクトのインターフェイスを定義します。これにより、これらのオブジェクトに責任を動的に追加できます。
(2)ConcreTeComponent(特定の装飾的なオブジェクト):特定のオブジェクトを定義し、装飾者はそれに追加の責任を追加できます。
(3)デコレーター(デコレーターの要約クラス):コンポーネントインスタンスへの参照を維持し、コンポーネントと一致するインターフェイス(つまり、装飾されたオブジェクトのベースクラスを継承または実装する)を定義します。
(4)concretedecorator:特定の装飾的なオブジェクト。内部に保持されている特定の装飾的なオブジェクトに特定の責任を追加します。
これは誰もが理解するのが少し難しいかもしれないので、私たちはまだ静かです:
冬の後、天気は寒くなり、寒くなりました。仕事を辞めた後、ベテランの食通として、2人か3人の友人と鍋のごちそうを食べるために約束するのは素晴らしいことです。ホットポットといえば、あらゆる種類のポットボトムとサイドディッシュを備えた、私が成都で食べたダロンホットポットについて言及する必要がありますが、私のお気に入りはダロンの鍋、スパイシーな牛肉、ダダオトリペ、ティアンヴァイソーセージ、トゥオトゥオビーフ、スパイシーポークリブなどのオリジナルのポットです。
これに関しては、少し気分が悪くなるはずです。上記のポットの底は、実際には装飾的なオブジェクトのベースです。成分は実際には装飾的な抽象的なオブジェクトです。ダロンのホットポットのオリジナルポットの底の特定のポットの底は、特定の装飾的なオブジェクトです。ポットの底を飾るために使用されるさまざまなサイドディッシュは、特定の装飾的なオブジェクトです。これについて言えば、誰もが突然それを実現する必要がありました。特定のコード実装を開始しましょう。
ステップ1:装飾されたオブジェクトのベースクラスを定義します(抽象クラスまたはインターフェイスにすることができます)
パブリックインターフェイスguodi {public float cost(); //もちろんポットボトムは価格設定する必要がありますパブリックストリング名(); //名前も利用できる必要があります}ステップ2:特定の装飾的なオブジェクトを定義します(つまり、さまざまなポットボトム、2つはここで定義されています)
パブリッククラスのYuanyangはGuodiを実装しています{@Override public float Cost(){return 48.0f; } @Override public string name(){return "double pot base"; }} public class dalongyanはguodiを実装します{@override public float cost(){return 59.0f; } @Override public String name(){return "Dalong Hot Pot Original Pot Base"; }}ステップ3:デコレーターの抽象クラスを定義します
パブリックアブストラクトクラスのペイカイはguodiを実装しています{private guodi guodi; Public FoodDecorator(Guodi Guodi){super(); this.guodi = guodi; } @Override public float cost(){return guodi.cost(); } @Override public string name(){return guodi.name(); }}ステップ4:特定のデコレーターオブジェクトを定義します
Public Class MalaniurouはPeicaiを拡張します{Public Malaniurou(Guodi guodi){super(guodi); } @override public float cost(){return super.cost()+46f; } @Override public String name(){return super.name()+"+spicy beef"; }} public class maoduはペイカイ{public maodu(guodi guodi){super(guodi); } @Override public float cost(){return super.cost()+30f; } @Override public String name(){return super.name()+"+big nife tripe"; }}テストクラス:
public class test {public static void main(string [] args){guodi guodi = new dalongyan(); // dalongホットポットオリジナルポットボトムボトムボトムマラニウーーy = new malaniurou(guodi); // get spicy beef maodu x = new maodu(y);注文 "+x.name()+"、cushume "+s.cost()); }}出力結果:
1.ダロンホットポットオリジナルポットボトム +スパイシービーフ +ダダオトライプの合計が注文され、合計135が消費されました
上記は、編集者によって紹介されたJavaデコレーターモデルです(実際の観点からコード原則を理解してください)。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!