Composite パターン
* 再帰的な構造の取り扱いを容易 => つまり、階層構造で表現されるオブジェクトの取扱いを容易にするパターン => 例えば、ファイルシステムや XMLで表現されるデータ構造(連絡網、部署、プロジェクト(大項目~小項目)など)
デメリット
* 実装の必要のないメソッドが、インターフェイスに定義される
登場人物
Leaf(葉)
* 「中身」を表すクラス
Composite (合成物)
* 「容器」を表すクラス * 内容物として、複数の 『Leaf』や 『Composite』の保持が可能 * 『Component』を実装したオブジェクトに対して再帰処理を行う
Component (部品)
* 『Leaf』と『Composite』を同一視するためのインタフェース
サンプル
IEntity.java
* Component (部品)public interface IEntity { public long getId(); public String getName(); public void add(IEntity subordinate); public void printTree(); }
Group.java
* Composite(合成物)import java.util.ArrayList; import java.util.List; public class Group extends Employee { private List<IEntity> members; public Group(long id, String name) { super(id, name); this.members = new ArrayList<IEntity>(); } @Override public void add(IEntity member) { this.members.add(member); } @Override public void printTree() { super.printTree(); for (IEntity member : this.members) { member.printTree(); } } }
Employee.java
* Leaf(葉)import java.util.ArrayList; import java.util.List; public class Employee implements IEntity { private long id; private String name; private List<IEntity> subordinates; public Employee(long id, String name) { this(); this.id = id; this.name = name; } private Employee() { this.subordinates = new ArrayList<IEntity>(); } @Override public long getId() { return this.id; } @Override public String getName() { return this.name; } @Override public void add(IEntity subordinate) { this.subordinates.add(subordinate); } @Override public void printTree() { System.out.println(this.id + " : " +this.name); } }
Main.java
* 使用者(クライアント)public class Main { public static void main(String[] args) { Group group1 = new Group(10000, "Sales"); group1.add(new Employee(10001, "Mike")); group1.add(new Employee(10002, "Tom")); Group group2 = new Group(20000, "Developments"); group2.add(new Employee(20001, "Ted")); group2.add(new Employee(20002, "Ken")); group2.add(new Employee(20003, "Smith")); group2.add(new Employee(20004, "John")); group1.printTree(); group2.printTree(); } }
出力結果
10000 : Sales 10001 : Mike 10002 : Tom 20000 : Developments 20001 : Ted 20002 : Ken 20003 : Smith 20004 : John
参考文献
http://www.nulab.co.jp/designPatterns/designPatterns2/designPatterns2-4.htmlhttp://www.syboos.jp/sysdesign/doc/20080611165909478.html
http://www.techscore.com/tech/DesignPattern/Composite.html
http://telecastravinsky.blog.fc2.com/blog-entry-3.html
http://www.itsenka.com/contents/development/designpattern/composite.html
http://www.ie.u-ryukyu.ac.jp/~e085739/java.it.8.html
http://www.atmarkit.co.jp/fjava/javatips/107java015.html
どういったときに使うかを記述
http://think-on-object.blogspot.jp/2011/11/howto-gof-gof-g-ang-o-f-f-our44-23.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20060113/227229/
PHPだけど参考になった
http://www.doyouphp.jp/phpdp/phpdp_02-3-6_composite.shtml