一、簡介
組合模式常用於含有多個集合,每個集合又可能含有子集和或者子元素的情況,如專案經理下可能有專案組長,專案組長下有普通程式設計師,而銷售經理下可能只有業務人員(當然有的也有銷售組長,舉個例子而已)。
**示例
要求:
1、公司結構有總經理–經理–組長–普通人員(僅用作簡單例子,真正的結構更加複雜);
2、公司發布工作任務下去,如果當前人員有下屬職員則分配到下級人員;
抽象職員類:
public
abstract
class
staff
public
void
setsuperior(staff superior)
//是否是葉子節點(有下屬的不是葉子節點)
@override
public
final
boolean
isreaf()
//新增職員的方法(子類實現)
public
abstract
void
addstaff(staff staff);
//重寫tostring方法
@override
public string tostring()
//工作(有下級就叫下級做事,沒有下級自己做事)
public
final
void
dowork()
system.out.println("我是 "+this+",我的上司是 "+this.getsuperior()+" 沒有下屬自己做事");
}//叫下屬工作
public
final
void
callsomeonedowork()
}}
做事的dowork()方法定義為final,子類不能重寫該方法(其他final方法同理),這裡就是乙個簡單的模板方法模式,通過模板方法定義乙個通用方法來增強程式的復用率(當然這裡的使用是不合理的,畢竟每個人都有自己的工作內容,可以把功能內容單獨封裝為乙個抽象函式由子類實現,再把自己做的事放在函式第一行,就形成了乙個合理的模板方法模式了),當然這裡把工作交給下級處理的方式也體現了責任鏈模式的工作方式(並不完善的責任鏈模式,以後再做介紹)。
經理、組長、程式設計師實現類:
//專案經理
public
class
projectmanager
extends
staff
@override
//新增乙個職員
public
void
addstaff(staff staff)
}//專案組長
public
class
groupleader
extends
staff
@override
public
void
addstaff(staff staff)
}//普通程式設計師
public
class
programmer
extends
staff
}
其實新增職員的方法同樣可以在抽象類中實現,在葉子節點上重寫即可(這裡為了表現的更像乙個抽象類就新增這個抽象方法。。。完全可以直接實現,乙個抽象類可以沒有抽象方法,所以大家不要向我學習,畢竟可以節省不少**)
場景模擬:
public
class assembletest
}
場景非常簡單,只需要有乙個經理,讓他去做事就可以了(客戶就喜歡這麼簡單粗暴)
結果列印:
我是 projectmanager,我的上司是 null 有下屬叫下屬做事
我是 groupleader,我的上司是 projectmanager 有下屬叫下屬做事
我是 programmer,我的上司是 groupleader 沒有下屬自己做事
我是 programmer,我的上司是 groupleader 沒有下屬自己做事
我是 programmer,我的上司是 projectmanager 沒有下屬自己做事
(最後乙個程式設計師的上司是經理哦,搞不好他就是下乙個組長)
小結:
組合模式以一種樹形結構完成,可以讓客戶將集合或元素都視為同一種物件,但是這種模式違反了單一職責的原則,所以具體場景根據實際情況抉擇(對我而言,設計原則是為了更好的編碼,編碼則是為了完成業務功能,所以此時我覺得該用就用吧,功能實現的完美最重要)
Java設計模式學習08 組合模式
把部分和整體的關係用樹形結構來表示,從而使客戶端可以使用統一的方式對部分物件和整體物件進行管理。下面通過簡單的防毒例子,使用組合模式 示例 1.抽象構件 public inte ce abstractfile 2.葉子構件 class imagefile implements abstractfil...
設計模式8 組合模式
組合模式首先想到的就是樹形結構,比如我們常用的檔案結構,請看windows的檔案結構 無論是檔案或者是資料夾,常用操作都是一致的,比如 複製 貼上 剪下 刪除 所佔空間大小。我們並沒有刻意的去分他是資料夾還是檔案。我們可以把資料夾看成是組合物件,把每乙個檔案看成是單個物件。組合模式模糊了這兩個概念,...
《設計模式12 組合模式
組合模式其實是乙個很形象的模式。它也被稱為部分整體模式。組合模式的結構就如同樹狀圖一樣。而樹就是枝幹 葉子的組合,組合模式可以形象的這麼理解。其實資料夾是乙個很好的組合模式的體現。乙個資料夾 樹根root 下可能有多個資料夾 枝幹trunk 可能是單個的檔案 樹葉leaf 而枝幹是可以繼續向下延伸的...