|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
Compositeパターン (デザインパターン)
Compositeパターン 導入
木構造の例としてエクスプローラーで表示されるファイルのフォルダとファイルをイメージします。フォルダの中にはファイルが格納されますが、フォルダも格納することが出来ます。さらに格納したフォルダにはファイル、フォルダと階層構造をとっていきます。
親フォルダと子フォルダを考えるとサブフォルダは部分的に親フォルダの一部の構成になっています。またサブフォルダの構造(この場合作り)は、親フォルダと同一なもので定義できます。このような関係は再帰的である言いますが、Compositeパターンはこの再帰的構造を表現するものです。
Compositeパターンの構造は、入れ物と中身(フォルダ,ファイル)のものを同一視することで表現します。入れ物と中身を同一視できるように、両者の抽象クラスを定義することがポイントです。両者の抽象クラスは同一のインターフェースを定義することになるので入れ物、中身を意識することなく処理できます。
Compositeパターン ポイント
Compositeパターンの構造は、入れ物と中身(フォルダ,ファイル)のものを同一視することで表現します。入れ物と中身を同一視できるように、両者の抽象クラスを定義することがポイントです。両者の抽象クラスは同一のインターフェースを定義することになります。
UML Compositeパターン
C#ソースコード Compositeパターン
|
Sample.cs
|
|
using System;
using System.Collections;
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;
}
}
class Class1
{
[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 実行結果
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へもどる
|
|
| お天気情報 |
|
東京都 東京 - 今日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
東京都 東京 - 明日の天気
|
晴時々曇
-
|
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
東京都 東京 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
34 |
27 |
| 湿度
|
93.2 |
80.6 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - 今日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - 明日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|