JAVA設計模式之-組合模式
什么是組合模式?
組合模式是一種結(jié)構型設計模式,它可以讓你將對象組合成樹形結(jié)構,并且能像獨立對象一樣對待單個對象和組合體。這種模式創(chuàng)建了一個包含自己對象組的類,該類提供了修改相同對象組的方式。
主要解決什么問題?
組合模式主要解決的是“部分-整體”層次結(jié)構的問題,使得用戶對單個對象和組合對象的使用具有一致性。
在什么時候我們需要使用組合模式?
需要實現(xiàn)樹狀對象結(jié)構,那么組合模式是一個不錯的選擇。這樣可以統(tǒng)一處理“部分”(單個對象)和“整體”(對象組合)。例如,文件系統(tǒng)、圖形界面框架、組織結(jié)構等等。
舉例實例
以軍隊為例,軍隊由多個連隊組成,連隊又由多個排組成,排又由多個班組成,班再由多個士兵組成。在這個結(jié)構中,無論是軍隊、連隊、排、班,還是士兵,都可以被看作是一個“軍事單位”,他們都可以接收相同的命令,如“行軍”、“打仗”等。
優(yōu)點
高度整合。用戶不需要區(qū)分單個對象和組合對象,對于用戶來說,它們是一樣的。
易于擴展??梢噪S時增加新的對象和組合。
缺點
有可能使設計變得過于一般化。例如,一些設計要求單個對象和組合對象有不同的行為時,可能會變得復雜。
使用場景
組合模式在以下情況下是很有用的:
想表示對象的“部分-整體”層次結(jié)構。
想用戶忽略不同對象和對象組合之間的差異。用戶將單個對象和組合對象都看作統(tǒng)一的結(jié)構。
用代碼舉例說明
以下是一個簡單的Java代碼示例,用來演示組合模式。
// 組件抽象
abstract class Component {
? ? abstract void operation();
}
// 葉子組件
class Leaf extends Component {
? ? void operation() {
? ? ? ? System.out.println("Leaf");
? ? }
}
// 復合組件
class Composite extends Component {
? ? private List<Component> children = new ArrayList<>();
? ??
? ? void addComponent(Component component) {
? ? ? ? children.add(component);
? ? }
? ? void removeComponent(Component component) {
? ? ? ? children.remove(component);
? ? }
? ? void operation() {
? ? ? ? System.out.println("Composite");
? ? ? ? for (Component child : children) {
? ? ? ? ? ? child.operation();
? ? ? ? }
? ? }
}
在這個例子中,Component
?是組件的抽象,定義了一個?operation
?方法。
Leaf
?是葉子組件,只需要實現(xiàn)?operation
?操作。
Composite
?是復合組件,除了實現(xiàn)?operation
?方法,還有添加 (addComponent
) 和刪除 (removeComponent
) 子組件的方法。
operation
?方法會調(diào)用其所有子組件的?operation
?方法。