Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_5Number_3Number_9Number_8Number_8Number_5
インデント 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ページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

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

Compositeパターン 導入

木構造の例としてエクスプローラーで表示されるファイルのフォルダとファイルをイメージします。フォルダの中にはファイルが格納されますが、フォルダも格納することが出来ます。さらに格納したフォルダにはファイル、フォルダと階層構造をとっていきます。

親フォルダと子フォルダを考えるとサブフォルダは部分的に親フォルダの一部の構成になっています。またサブフォルダの構造(この場合作り)は、親フォルダと同一なもので定義できます。このような関係は再帰的である言いますが、Compositeパターンはこの再帰的構造を表現するものです。

Compositeパターンの構造は、入れ物と中身(フォルダ,ファイル)のものを同一視することで表現します。入れ物と中身を同一視できるように、両者の抽象クラスを定義することがポイントです。両者の抽象クラスは同一のインターフェースを定義することになるので入れ物、中身を意識することなく処理できます。

Compositeパターン ポイント

Compositeパターンの構造は、入れ物と中身(フォルダ,ファイル)のものを同一視することで表現します。入れ物と中身を同一視できるように、両者の抽象クラスを定義することがポイントです。両者の抽象クラスは同一のインターフェースを定義することになります。

UML Compositeパターン

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

Sample.cs

using System;
using System.Collections;

/***********************************************************
//
// デザインパターン Composite
//
// 説明 階層構造を表現するためにオブジェクトを
//                  木構造上に組み立てる。
//                  Compositeパターンを利用することでクライアントは
//                  個々のオブジェクトとその合成したものを一様に
//                  扱うことが可能
//
//                  実際のプログラムでは合計値がオブジェクトごとに必要
//                  になることが予想されます。より実践に近いケースを考えましょう
//
************************************************************/



namespace Composite2
{

   //お財布のコンポーネントの抽象定義
   public abstract class ComponentPurse
   {
       //お財布の持ち主の名前
       private string strName;
       private int intSumMoney =0;

       //属性として実装(派生クラスから参照される)
       //オブジェクトの名前
       protected string Name
       {
           set{this.strName=value;}
           get{return this.strName;}
       }
       //オブジェクトの金額
       protected int SumMoney
       {
           set{this.intSumMoney=value;}
           get{return this.intSumMoney;}
       }
       //財布に入れる
       public abstract void add(ComponentPurse c);
       //財布から出す
       public abstract void remove(ComponentPurse c);

       //財布の中身を列挙する
       public abstract void Enumerate();

       //財布の総額を計算する
       public abstract int sumCalc();


   }

   //お財布のコンポジット
   public class CompositePurse :ComponentPurse
   {
       public int SumPurse =0;

       private ArrayList child =new ArrayList();

       //コンストラクタ
       public CompositePurse(string strName)
       {
           base.Name=strName;
           base.SumMoney =0;
       }

       public override void add(ComponentPurse c)
       {
           child.Add(c);
       }
       public override void remove(ComponentPurse c)
       {
           child.Remove(c);
       }

       //列挙する
       public override void Enumerate()
       {
           System.Console.WriteLine(this.Name);
           foreach(ComponentPurse c in child)
           {
               c.Enumerate();
           }
       }

       //総額計算する
       public override int sumCalc()
       {
           int intTempSum=this.SumMoney;

           foreach(ComponentPurse c in child)
           {
               intTempSum +=c.sumCalc();
           }
           return intTempSum;
       }
   }



   public class LeafMoney :ComponentPurse
   {
       public LeafMoney(int intSumMoney)
       {
           base.Name ="入金" + intSumMoney.ToString() +"円";
           base.SumMoney=intSumMoney;
       }

       public override void add(ComponentPurse c)
       {
           Console.WriteLine("このメソッドに意味はありません");
       }
       public override void remove(ComponentPurse c)
       {
           Console.WriteLine("このメソッドに意味はありません");
       }
       //列挙する
       public override void Enumerate()
       {
           Console.WriteLine(this.Name);
       }
       //総額計算する
       public override int sumCalc()
       {
           return this.SumMoney;
       }

   }


   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {

           CompositePurse root =new CompositePurse("Isono家の家族の財布");
           root.add(new LeafMoney(10));
           root.add(new LeafMoney(20));

           //波平は波平の財布にお金を入れた
           CompositePurse namihei =new CompositePurse("波平の財布");
           namihei.add(new LeafMoney(100));
           namihei.add(new LeafMoney(200));
           root.add(namihei);

           //フネはフネの財布にお金を入れた
           CompositePurse fune =new CompositePurse("フネの財布");
           fune.add(new LeafMoney(150));
           fune.add(new LeafMoney(500));
           root.add(fune);

           //サザエはサザエの財布にお金を入れた
           CompositePurse sazae =new CompositePurse("サザエの財布");
           sazae.add(new LeafMoney(50));
           sazae.add(new LeafMoney(20));
           root.add(sazae);

           //マスオはマスオの財布にお金を入れた
           CompositePurse masuo =new CompositePurse("マスオの財布");
           masuo.add(new LeafMoney(5));
           masuo.add(new LeafMoney(3));
           root.add(masuo);

           //波平はへそくり財布を作った
           CompositePurse hideoHesokuri =new CompositePurse("波平のへそくり");
           //へそくり財布にお金をいれた
           hideoHesokuri.add(new LeafMoney(1000));
           hideoHesokuri.add(new LeafMoney(500));
           //へそくり財布を波平の財布の中にしまった。
           namihei.add(hideoHesokuri);
           //出力確認
           Console.WriteLine("******************************************");
           Console.WriteLine("Isono家のお財布の強制捜査を行います。");
           Console.WriteLine("みなさん!!財布を出してください。!!");
           Console.WriteLine("インチキできませんよ!!");
           Console.WriteLine("Compositeパターンでは、お金と財布を同時に扱えます。");
           Console.WriteLine();
           root.Enumerate();
           Console.WriteLine("Isonoの所持金は?");
           Console.WriteLine("\t" + root.sumCalc().ToString() +"円です");

           Console.WriteLine("******************************************");
           Console.WriteLine("波平の財布についてを列挙する");
           namihei.Enumerate();
           Console.WriteLine("波平の所持金についてを列挙する");
           Console.WriteLine("\t" +namihei.sumCalc().ToString() +"円です");

           Console.WriteLine("******************************************");

           Console.WriteLine("フネの財布についてを列挙する");
           fune.Enumerate();
           Console.WriteLine("フネの所持金についてを列挙する");
           Console.WriteLine("\t" + fune.sumCalc().ToString()+"円です");

           Console.WriteLine("******************************************");

           Console.WriteLine("サザエ君の財布についてを列挙する");
           sazae.Enumerate();
           Console.WriteLine("サザエ君の所持金は?");
           Console.WriteLine("\t" + sazae.sumCalc().ToString() +"円です");
           Console.WriteLine("******************************************");

           Console.WriteLine("マスオちゃんの財布についてを列挙する");
           masuo.Enumerate();
           Console.WriteLine("マスオちゃんの所持金は?");
           Console.WriteLine("\t" + masuo.sumCalc().ToString() +"円です");

           Console.WriteLine("******************************************");

           Console.WriteLine();

       }
   }
}

Composite 実行結果

Composite_fig

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

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

CompositePurse.java
   1: package composite;
   2: 
   3: import java.util.Collection;
   4: import java.util.*;
   5: 
   6: public class CompositePurse extends ComponentPurse {
   7: 
   8: 
   9:     private Collection componentPurse = new ArrayList();
  10: 
  11:     public void add(ComponentPurse component) {
  12:         componentPurse.add(component);
  13:     }
  14: 
  15:     public void remove(ComponentPurse component) {
  16:         componentPurse.remove(component);
  17:     }
  18:     
  19:     //列挙する
  20:     public void enumerate() {
  21:         
  22:         System.out.println(this.getName());
  23:         
  24:         Iterator itr =componentPurse.iterator();
  25:         
  26:         while(itr.hasNext()){
  27:             //別変数にセット
  28:             ComponentPurse c =(ComponentPurse)itr.next();
  29:             c.enumerate();
  30:         }
  31:     }
  32:     
  33:     //合計値を計算する
  34:     public int sumCalc() {
  35:         
  36:         int intTempSum=this.getSumMoney();
  37:     
  38:         Iterator itr =componentPurse.iterator();
  39:         while(itr.hasNext()){
  40:             //別変数にセット
  41:             ComponentPurse c =(ComponentPurse)itr.next();
  42:             intTempSum +=c.sumCalc();
  43:         }
  44:         return intTempSum;
  45:     }
  46: 
  47:     public CompositePurse(String strName) {
  48:         super.setName(strName);
  49:         super.setSumMoney(0);
  50:     }
  51: 
  52: }
ComponentPurse.java
   1: package composite;
   2: 
   3: public abstract class ComponentPurse {
   4: 
   5:     private String Name;
   6: 
   7:     private int SumMoney;
   8: 
   9:     public abstract void add(ComponentPurse component);
  10: 
  11:     public abstract void remove(ComponentPurse component);
  12: 
  13:     public abstract void enumerate();
  14: 
  15:     public abstract int sumCalc();
  16: 
  17:     public String getName() {
  18:         return Name;
  19:     }
  20: 
  21:     public void setName(String Name) {
  22:         this.Name = Name;
  23:     }
  24: 
  25:     public int getSumMoney() {
  26:         return SumMoney;
  27:     }
  28: 
  29:     public void setSumMoney(int SumMoney) {
  30:         this.SumMoney = SumMoney;
  31:     }
  32: 
  33: }
LeafMoney.java
   1: package composite;
   2: 
   3: public class LeafMoney extends ComponentPurse {
   4: 
   5:     public void add(ComponentPurse component) {
   6:     }
   7: 
   8:     public void remove(ComponentPurse component) {
   9:     }
  10: 
  11:     public void enumerate() {
  12:         System.out.println(this.getName());
  13:     }
  14: 
  15:     public int sumCalc() {
  16:         return this.getSumMoney();
  17:     }
  18: 
  19:     public LeafMoney(int intMoney) {
  20:         super.setName("入金" + intMoney + "円");
  21:         super.setSumMoney(intMoney);
  22:     }
  23: }
Client.java
   1: package composite;
   2: 
   3: public class Client {
   4: 
   5:     public static void main(String[] args) {
   6:         CompositePurse root =new CompositePurse("Isono家の全部の財布");
   7:                     root.add(new LeafMoney(10));
   8:                     root.add(new LeafMoney(20));
   9: 
  10:                     //波平は波平の財布にお金を入れた
  11:                     CompositePurse namihei =new CompositePurse("波平の財布");
  12:                     namihei.add(new LeafMoney(100));
  13:                     namihei.add(new LeafMoney(200));
  14:                     root.add(namihei);
  15: 
  16:                     //フネはフネの財布にお金を入れた
  17:                     CompositePurse fune =new CompositePurse("フネの財布");
  18:                     fune.add(new LeafMoney(150));
  19:                     fune.add(new LeafMoney(500));
  20:                     root.add(fune);
  21: 
  22:                     //サザエはサザエの財布にお金を入れた
  23:                     CompositePurse sazae =new CompositePurse("サザエの財布");
  24:                     sazae.add(new LeafMoney(50));
  25:                     sazae.add(new LeafMoney(20));
  26:                     root.add(sazae);
  27:             
  28:                     //マスオはマスオの財布にお金を入れた
  29:                     CompositePurse masuo =new CompositePurse("マスオの財布");
  30:                     masuo.add(new LeafMoney(5));
  31:                     masuo.add(new LeafMoney(3));
  32:                     root.add(masuo);
  33: 
  34:                     //波平はへそくり財布を作った
  35:                     CompositePurse namiheiHesokuri =new CompositePurse("波平のへそくり");
  36:                     //へそくり財布にお金をいれた
  37:                     namiheiHesokuri.add(new LeafMoney(1000));
  38:                     namiheiHesokuri.add(new LeafMoney(500));
  39:                     //へそくり財布を波平の財布の中にしまった。
  40:                     namihei.add(namiheiHesokuri);
  41: 
  42:                     System.out.println("******************************************");
  43: 
  44:                     System.out.println("Isono家のお財布の強制捜査を行います。");
  45:                     System.out.println("みなさん!!財布を出してください。!!");
  46:                     System.out.println("インチキできませんよ!!");
  47:                     System.out.println("Compositeパターンでは、お金と財布を同時に扱えます。");
  48:                     System.out.println();
  49:                     root.enumerate();
  50:                     System.out.println("Isono家の所持金は?");
  51:                     System.out.println("\t" + root.sumCalc() +"円です");
  52:             
  53: 
  54:                     System.out.println("******************************************");
  55: 
  56:                     System.out.println("波平の財布についてを列挙する");
  57:                     namihei.enumerate();
  58:                     System.out.println("波平の所持金についてを列挙する");
  59:                     System.out.println("\t" + namihei.sumCalc() +"円です");
  60:             
  61:                     System.out.println("******************************************");
  62:             
  63:                     System.out.println("フネの財布についてを列挙する");
  64:                     fune.enumerate();
  65:                     System.out.println("フネの所持金についてを列挙する");
  66:                     System.out.println("\t" + fune.sumCalc() + "円です");
  67: 
  68:                     System.out.println("******************************************");
  69: 
  70:                     System.out.println("サザエ君の財布についてを列挙する");
  71:                     sazae.enumerate();
  72:                     System.out.println("サザエ君の所持金は?");
  73:                     System.out.println("\t" + sazae.sumCalc() +"円です");
  74:                     System.out.println("******************************************");
  75: 
  76:                     System.out.println("マスオちゃんの財布についてを列挙する");
  77:                     masuo.enumerate();
  78:                     System.out.println("マスオちゃんの所持金は?");
  79:                     System.out.println("\t" + masuo.sumCalc() +"円です");
  80: 
  81:                     System.out.println("******************************************");
  82:             
  83:                     System.out.println();
  84:     }
  85: }



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

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

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