對象的結構模式,又稱“部分-整體”模式。

合成模式將對象組織到樹結構中,可以用來描述整體與部分的關系。合成模式可以使客戶端將單純元素與復合元素同等對待

適用場合
1. 需要描述對象的部分和整體的等級結構。
2. 需要客戶端忽略掉個體構件和組合構件的區別。客戶端必須平等對待所有的構件,包括個體構件和組合構件。

優點
1. 合成模式可以很容易地增加新種類的構件。
2. 使用合成模式可以使客戶端變得很容易設計,因為客戶端不需要知道構件是樹葉構件還是樹枝構件。
缺點
1. 使用合成模式后,控制樹枝構件的類型就不太容易。
2. 用繼承的方法來增加新的行為很困難。


透明式的合成模式
1. com.cleversoft.designpatterns.transparentcomposite.Graphics.java:

package ?com.cleversoft.designpatterns.transparentcomposite;

abstract ? public ? class ?Graphics? {
????
public ? abstract ? void ?draw();

????
public ? abstract ? void ?add(Graphics?g);

????
public ? abstract ? void ?remove(Graphics?g);

????
public ? abstract ?Graphics?getChild( int ?i);
}

2. com.cleversoft.designpatterns.transparentcomposite.Circle.java:
package?com.cleversoft.designpatterns.transparentcomposite;

public?class?Circle?extends?Graphics?{
????
public?void?draw()?{
????????System.out.println(
"Drawing?Circle");
????}


????
public?void?add(Graphics?g)?{
????????
//?do?nothing
????}


????
public?void?remove(Graphics?g)?{
????????
//?do?nothing
????}


????
public?Graphics?getChild(int?i)?{
????????
return?null;
????}

}

3. com.cleversoft.designpatterns.transparentcomposite.Line.java:
package?com.cleversoft.designpatterns.transparentcomposite;

public?class?Line?extends?Graphics?{
????
public?void?draw()?{
????????System.out.println(
"Draw?Line");
????}


????
public?void?add(Graphics?g)?{
????????
//?do?nothing
????}


????
public?void?remove(Graphics?g)?{
????????
//?do?nothing
????}


????
public?Graphics?getChild(int?i)?{
????????
return?null;
????}

}

4. com.cleversoft.designpatterns.transparentcomposite.Rectangle.java:
package?com.cleversoft.designpatterns.transparentcomposite;

public?class?Rectangle?extends?Graphics?{
????
public?void?draw()?{
????????System.out.println(
"Drawing?Rectangle");
????}


????
public?void?add(Graphics?g)?{
????????
//?do?nothing
????}


????
public?void?remove(Graphics?g)?{
????????
//?do?nothing
????}


????
public?Graphics?getChild(int?i)?{
????????
return?null;
????}

}

5. com.cleversoft.designpatterns.transparentcomposite.Picture.java:
package?com.cleversoft.designpatterns.transparentcomposite;

import?java.util.Vector;

public?class?Picture?extends?Graphics?{
????
private?Vector<Graphics>?list?=?new?Vector<Graphics>(10);

????
public?void?draw()?{
????????
for?(int?i?=?0;?i?<?list.size();?i++)?{
????????????Graphics?g?
=?(Graphics)?list.get(i);
????????????g.draw();
????????}

????}


????
public?void?add(Graphics?g)?{
????????list.add(g);
????}


????
public?void?remove(Graphics?g)?{
????????list.remove(g);
????}


????
public?Graphics?getChild(int?i)?{
????????
return?(Graphics)?list.get(i);
????}

}

6. com.cleversoft.designpatterns.transparentcomposite.Client.java:
package?com.cleversoft.designpatterns.transparentcomposite;

public?class?Client?{

????
/**
?????*?Transparent?Composite
?????
*/

????
public?static?void?main(String[]?args)?{
????????Picture?p?
=?new?Picture();
????????p.add(
new?Circle());
????????p.add(
new?Line());

????????Rectangle?r?
=?new?Rectangle();
????????p.add(r);

????????p.draw();
????}


}


安全式的合成模式
1. com.cleversoft.designpatterns.safecomposite.Graphics.java:
package?com.cleversoft.designpatterns.safecomposite;

abstract?public?class?Graphics?{
????
public?abstract?void?draw();
}

2. com.cleversoft.designpatterns.safecomposite.Circle.java:
package?com.cleversoft.designpatterns.safecomposite;

public?class?Circle?extends?Graphics?{
????
public?void?draw()?{
????????System.out.println(
"Drawing?Circle");
????}

}

3. com.cleversoft.designpatterns.safecomposite.Line.java:
package?com.cleversoft.designpatterns.safecomposite;

public?class?Line?extends?Graphics?{
????
public?void?draw()?{
????????System.out.println(
"Drawing?Line");
????}

}

4. com.cleversoft.designpatterns.safecomposite.Rectangle.java:
package?com.cleversoft.designpatterns.safecomposite;

public?class?Rectangle?extends?Graphics?{
????
public?void?draw()?{
????????System.out.println(
"Drawing?Rectangle");
????}

}

5. com.cleversoft.designpatterns.safecomposite.Picture.java:
package?com.cleversoft.designpatterns.safecomposite;

import?java.util.Vector;

public?class?Picture?extends?Graphics?{
????
private?Vector<Graphics>?list?=?new?Vector<Graphics>(10);

????
public?void?draw()?{
????????
for?(int?i?=?0;?i?<?list.size();?i++)?{
????????????Graphics?g?
=?(Graphics)?list.get(i);

????????????g.draw();
????????}

????}


????
public?void?add(Graphics?g)?{
????????list.add(g);
????}


????
public?void?remove(Graphics?g)?{
????????list.remove(g);
????}


????
public?Graphics?getChild(int?i)?{
????????
return?(Graphics)?list.get(i);
????}

}

6. com.cleversoft.designpatterns.safecomposite.Client.java:
package?com.cleversoft.designpatterns.safecomposite;

public?class?Client?{

????
/**
?????*?Safe?Composite
?????
*/

????
public?static?void?main(String[]?args)?{
????????Picture?p?
=?new?Picture();
????????p.add(
new?Circle());
????????p.add(
new?Line());

????????Rectangle?r?
=?new?Rectangle();
????????p.add(r);

????????p.draw();
????}


}


參考資料:
1. 《Java與模式》
2. http://terrylee.cnblogs.com/archive/2006/03/11/347919.html


歡迎大家訪問我的個人網站 萌萌的IT人