### 組合模式
將對象組合成樹形結構以表示”部分-整體“的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
舉個例子,一個車是由發動機,輪子,車架,輪胎組成,那么從層次上來劃分肯定是
車 第一層
車架,發動機,輪子 第二層
輪胎 第三層
那么從程序上可以把這些都當成元素來處理,區別在于大元素和小元素,大元素可以添加小元素,例如車可以添加輪子,車架和發動機。輪子可以添加輪胎。車架,發動機和輪胎則不能添加東西。把這些元素組合起來就可以組成一輛車,而這輛車也可以成為f1賽車的一個元素,同時輪胎也可以成為f1賽車的一個元素。
首先我們定義一個Component類,然后分大小元素都去繼承與這個Component類,再分開去實現分支節點(大元素)和葉子節點(小元素)。
~~~
import java.util.ArrayList;
import java.util.List;
public abstract class Component
{
public String name;
public Component(String name)
{
this.name = name;
}
public abstract void add(Component c);
public abstract void delete(Component c);
}
public class Composite extends Component
{
public Composite(String name) {
super(name);
// TODO Auto-generated constructor stub
}
private List<Object> list = new ArrayList<Object>();
@Override
public void add(Component c) {
// TODO Auto-generated method stub
list.add(c);
}
@Override
public void delete(Component c) {
// TODO Auto-generated method stub
list.remove(c);
}
}
public class Leaf extends Component
{
public Leaf(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void add(Component c) {
// TODO Auto-generated method stub
//葉子節點不需要添加操作
}
@Override
public void delete(Component c) {
// TODO Auto-generated method stub
//葉子節點不需要刪除操作
}
}
class Client
{
public static void main()
{
Composite root = new Composite("root");
car.add(new Leaf("Leaf A"));
car.add(new Leaf("Leaf B"));
Composite branch = new Composite("branch");
wheel.add(new Leaf("Leaf C"));
car.add(branch);
}
}
~~~
這個時候有人會問,既然葉子節點不需要add和remove那么為什么要寫到Component類里面?其實這里就有兩種方式:透明方式與安全方式。
透明方式:在Component中申明所有用來管理子對象的方法,好處是所有的子類的方法接口都一樣,缺點是有些元素不需要實現一些方法。
安全方式:在Component中不去申明所有的管理子對象的方法,例如add和remove,把add和remove寫到Composite里面去申明。這樣由于分支節點和葉子節點將不具有相同的接口,客戶端調用需要做相應的判斷。
### 何時使用組合模式
需求中是體現部分與整體的層次結構時,以及你希望用戶可以忽略組合對象與單個對象的不同,統一的使用組合結構中所有的對象時,就應該考慮組合模式了。(摘抄)
- 前言
- (1)代碼無錯就是優?——簡單工廠模式
- (2)商場促銷——策略模式
- (3)&amp;(4)&amp;(5) 設計模式原則
- (6)穿什么有這么重要?——裝飾模式
- (7)為別人做嫁衣——代理模式
- (8)雷鋒依然在人間——工廠方法模式
- (9)簡歷復印——原型模式
- (10)考題抄錯會做也白搭——模板方法模式
- (11)迪米特法則
- (12)牛市股票還會虧錢?—— 外觀模式
- (13)好菜每回味不同——建造者模式
- (14)老板回來,我不知道——觀察者模式
- java實現事件委托
- (15)就不能不還DB嗎?—— 抽象工廠模式
- (16)無盡加班何時休息——狀態模式
- (17)在NBA我需要翻譯——適配器模式
- (18)如果再回到從前——備忘錄模式
- (19)分公司=部門——組合設計模式
- (20)想走?可以!先買票——迭代器模式
- (21)有些類也需計劃生育——單例模式
- (22)手機軟件何時統一——橋接模式
- (23)烤羊肉串引來的思考——命令模式
- (24)加薪非要老總批?——職責鏈模式
- (25)世界需要和平——中介者模式
- (26)項目多也別傻做——享元模式
- (28)男人和女人——訪問者模式