Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_1Number_3Number_9Number_3Number_0Number_8Number_9
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Decoratorパターン (デザインパターン)

Decoratorパターン 導入

Decoratorパターンは、委譲を活用して振る舞いを装飾(拡張)するパターンです。 部品は装飾されることを前提として考えます。具象装飾部品と装飾者の抽象部品のクラスを設定することで 操作に関する共通のインターフェースを定義します。装飾者は部品を保持し、 装飾部品に関する操作(Operation)を各具象装飾者で再定義する形になります。

Decoratorパターン ポイント

機能の拡張に関して、継承で対応しようとすれば機能拡張を行う数だけのクラスが必要になります。 ケーキの装飾を考えた場合、(下記のような組み合わせが考えられます。)
  • 継承によってクラス定義をする。
    • カステラを敷く
    • クリームを塗る
    • ネームプレートをつける
    • カステラを敷く+クリームを塗る
    • カステラを敷く+ネームプレートをつける
    • クリームを塗る++ネームプレートをつける
    • カステラを敷く+クリームを塗る+ネームプレートをつける
装飾の順番まで含めて管理しようとなると、数がさらに多くなります。 Decoratorパターンでは拡張する機能の一つ一つが独立したクラスになっており、実行時には 装飾者の組み合わせで対応することが出来ます。

UML Decoratorパターン

C#ソースコード Decoratorパターン

Sample.cs

using System;

namespace Decorator
{
   //------------------------------------------------------------------
   //
   //  デザインパターン Decorator
   //
   //  オブジェクトに付加的な機能を動的に追加する
   //
   //-----------------------------------------------------------------

   //装飾される部品操作に対する
   //インターフェースを定義します。
   public abstract class Component
   {
       public abstract void Operation();
   }

   //装飾部品を定義します
   //今回は「カステラ」を生地とします
   public class ConcreteComponent_Kasutera : Component
   {
       //この部品は操作のインターフェースを実装します
       public override void Operation()
       {
           Console.WriteLine("実装部品基底の操作:スポンジケーキ(カステラ)を敷き詰めます!");
       }
   }

   //抽象装飾者の定義
   //今回は「ケーキ屋さん」です
   public abstract class Decorator :Component
   {
       private Component comp;

       //操作を受け取ります
       //(具象装飾者の操作などを参照するのに使用します)
       public Component SetComponent
       {
           set{this.comp=value;}
           get{return this.comp;}
       }

       //共通のインターフェースで操作します
       //ここは、場合によっては抽象メソッドでもいいですね
       public override void Operation()
       {
           if(this.comp !=null)
           {
               comp.Operation();
           }
       }
   }


   //具象装飾者1
   //Shimizuシェフは「クリーム」の係りです
   public class ConcreteDecorator_Shimizu :Decorator
   {
       private string strAddedState;

       public string AddState
       {
           get{return this.strAddedState;}
       }

       public override void Operation()
       {
           base.Operation();
           //状態を記録(拡張例)
           strAddedState ="Cream しました!";
           Console.WriteLine("清水飾り:クリームでデコレーションしました");
       }
   }

   //具象装飾者2
   //Michibaは「飾り付け」の係りです
   public class ConcreteDecorator_Michiba :Decorator
   {
       private string strBirthDayName=null;
       public string BirthDayName
       {
           set{this.strBirthDayName=value;}
       }

       public override void Operation()
       {
           base.Operation();           //必要に応じて実装します
           //追加処理(拡張例)
           AddedBehavior_BirthDay();   //追加メソッド
           Console.WriteLine("道場飾り:最後に、フルーツを盛り付けます。");
       }

       //拡張メソッド
       private void AddedBehavior_BirthDay()
       {
           if (this.strBirthDayName !=null)
           {
               Console.WriteLine("道場飾り:ネームプレート付けました :" +
                                   strBirthDayName + "さん、おめでとう!");
           }
       }
   }


   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //部品(カステラ)を生成
           ConcreteComponent_Kasutera Kasutera =new ConcreteComponent_Kasutera();

           //Shimizuシェフ登場
           ConcreteDecorator_Shimizu Shimizu   =new ConcreteDecorator_Shimizu();
           //Michibaシェフ登場
           ConcreteDecorator_Michiba Michiba   =new ConcreteDecorator_Michiba();

           //Shimizuシェフに材料を渡します
           Shimizu.SetComponent=Kasutera;

           //-----------------確認用メソッド(開始)-----------------------//
           //Michiba.SetComponent=Kasutera;
           //Shimizuシェフの操作を確認します。
           //Shimizu.Operation();
           //Michibaシェフの操作を確認します。
           //Michiba.Operation();
           //-----------------確認用メソッド(終了)-----------------------//

           //Michibaシェフにバースデイネームを伝えます。
           Michiba.BirthDayName="ひでお";

           //部品を再セット(装飾者を部品としてセット)
           //DecoratorクラスはComponentクラスを継承しているのでセット可能
           //この場合、Oprationメソッドが呼び出されると、
           //Shimizuシェフ操作が委譲されます
           Michiba.SetComponent=Shimizu;

           //Michibaシェフの操作を実行します
           Michiba.Operation();

           //---------------------------------------------------------//
           //  解説
           //
           //  利用者(Client)はDecoratorを生成する時に、その装飾者に対して
           //  Componetを与えます。別の言い方をすれば、装飾するオブジェクト生成時に、
           //  装飾されるオブジェクトが必要になるということです。
           //  具象装飾者(Decoratorクラスを継承したインスタンス)は、与えられた
           //  Componetを保持し、ある操作が呼び出された時に、格納先のComponent
           //  インターフェースを介して、要求を派生クラスなどへ委譲します。
           //  その前後に別の処理を行うことで処理を拡張していきます。
           //
           //----------------------------------------------------------//
       }
   }
}

Decorator 実行結果

decorator_fig

UMLプラグインによる描画 Decoratorパターン

Javaソースコード Decoratorパターン

Component.java
   1: package decorator;
   2: 
   3: public abstract class Component {
   4: 
   5:     public abstract void operation();
   6: 
   7: }
ConcreteComponent_Kasutera.java
   1: package decorator;
   2: 
   3: public class ConcreteComponent_Kasutera extends Component {
   4:     
   5:     //この部品は操作のインターフェースを実装します。
   6:     public void operation() {
   7:         System.out.println("スポンジとして、底に薄く敷き詰めます。");
   8:     }
   9: 
  10: }
Decorator.java
   1: package decorator;
   2: 
   3: public abstract class Decorator extends Component {
   4: 
   5: 
   6:     private Component component;
   7: 
   8:     //ここには装飾者共通の操作があるときに使用します。
   9:     //何も無い場合は、abstractでもいいですね。
  10:     public void operation() {
  11:         //例)実装はコンポーネントの操作があるときは
  12:         //実行するようにします。
  13:         if (this.component !=null){
  14:             this.component.operation();
  15:         }
  16:     }
  17: 
  18:     public Component getComponent() {
  19:         return component;
  20:     }
  21:     //具象部品がセットされます。
  22:     public void setComponent(Component component) {
  23:         this.component = component;
  24:     }
  25: 
  26: }
ConcreteDecorator_Michiba.java
   1: package decorator;
   2: 
   3: public class ConcreteDecorator_Michiba extends Decorator {
   4: 
   5:     private String BirthDayName;
   6: 
   7:     public void operation() {
   8:         //必要に応じて実装します。
   9:         super.operation();
  10:         
  11:         //追加操作
  12:         addedBehavior_BirthDay();
  13:         System.out.println("道場飾り:最後にフルーツを盛りました。");
  14:     }
  15: 
  16:     //helperメソッド
  17:     private void addedBehavior_BirthDay() {
  18:         
  19:         if(this.BirthDayName !=null)
  20:         {
  21:             System.out.println("道場飾り:ネームプレートをつけました\n"
  22:                         + BirthDayName +"さん、誕生日おめでとう!");
  23:         }
  24:     }
  25: 
  26:     public void setBirthDayName(String BirthDayName) {
  27:         this.BirthDayName = BirthDayName;
  28:     }
  29: 
  30: }
ConcreteDecorator_Shimizu.java
   1: package decorator;
   2: 
   3: public class ConcreteDecorator_Shimizu extends Decorator {
   4: 
   5:     private String addState;
   6: 
   7:     public void operation() {
   8:         //Derectorクラスで定義された操作を行います。
   9:         super.operation();
  10:         //状態を記録します。
  11:         this.setAddState("Creamしました!");
  12:         System.out.println("清水飾り:クリームでデコレーションしました。");
  13:     }
  14: 
  15:     public String getAddState() {
  16:         return addState;
  17:     }
  18: 
  19:     public void setAddState(String addState) {
  20:         this.addState = addState;
  21:     }
  22: 
  23: }
StartClass.java
   1: package decorator;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         
   7:         //具象部品のインスタンス作成
   8:         ConcreteComponent_Kasutera kasutera =new ConcreteComponent_Kasutera();
   9:         
  10:         //具象装飾者のインスタンス作成
  11:         ConcreteDecorator_Shimizu shimizu =new ConcreteDecorator_Shimizu();
  12:         ConcreteDecorator_Michiba michiba =new ConcreteDecorator_Michiba();
  13:         
  14:         //具象部品を装飾者にセットします。
  15:         shimizu.setComponent(kasutera);
  16:         
  17:         
  18:         //動作を確認します。(開始)
  19:         //michiba.setComponent(kasutera);
  20:         //shimizu.operation();
  21:         //michiba.operation();
  22:         //動作を確認します。(終了)
  23:         
  24:         //バースデイネームをセットします。
  25:         michiba.setBirthDayName("ひでお");
  26:         //Componentクラスを継承させているので、具象装飾者に対して
  27:         //具象部品だけでなく装飾者のインスタンスを渡すことも可能です。
  28:         //これにより柔軟な付加機能追加を拡張できます。
  29:         michiba.setComponent(shimizu);
  30:         michiba.operation();
  31:         
  32:     }
  33: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
曇り - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - 明日の天気
晴のち雨 - リンク先
最高 最低
気温 9 3
湿度 48.2 37.4
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 11 4
湿度 51.8 39.2
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴のち曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 明日の天気
- リンク先
最高 最低
気温 11 5
湿度 51.8 41
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 7 3
湿度 44.6 37.4
取得日:2012/02/05 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
rarestyle
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索