設計模式 - 組合模式 (Structural Patterns - Composite Design Pattern)
前言
Wiki對於 Composite Pattern的定義如下:
The Composite [2] design pattern is one of the twenty-three well-known GoF design patterns that describe how to solve recurring design problems to design flexible and reusable object-oriented software, that is, objects that are easier to implement, change, test, and reuse.
定議提到的組合模式引入可以帶來,更方便的實作、改變、測試和重用,而這些好處在介紹完範例後,再逐步分析。
類別圖
組合模式基本概念
- 將組合模式中的每個物件都定義成 “is a”
- 每個物件都會記成Component抽象類別
- 基本物件會被定義成Leaf
- Composite包裝Leaf,當作一個Leaf的集合
- Composite會逐步的訪問每個包裝在內的子物件
範例
英雄遊戲,今天我們角色發展差不多了,需要開始讓玩家有更多的互動,所以老闆想到了戰團系統,而每個戰團都是由小隊組成(因為工城戰這樣比較好指揮)。看來這個新的系統設計非常適合我們剛剛學到的Composite Pattern,戰團(Composite)而小隊(Component),那我們開始撰寫吧。
- 創立群組(Group)概念,因為聯盟和小隊都是一個群組
- 將小隊包裝進聯盟裡
- 當要使用聯盟時,小隊就會逐步的被使用到
import java.util.ArrayList;
abstract class Group {
private String name;
Group(String name) {
this.name = name;
}
String getName() {
return name;
}
public abstract void print();
public abstract void addGroup(Group group);
}
class Team extends Group {
Team(String name) {
super(name);
}
@Override
public void print() {
System.out.println(getName());
}
@Override
public void addGroup(Group group) {
}
}
class League extends Group {
private ArrayList<Group> groupList = new ArrayList<>();
League(String name) {
super(name);
}
@Override
public void print() {
System.out.println(getName());
for(Group group : groupList) {
group.print();
}
}
@Override
public void addGroup(Group group) {
groupList.add(group);
}
}
public class Composite {
public static void main(String[] args) {
Group newLeague = new League("Hero League");
Group firstTeam = new Team("First Team");
Group secondTeam = new Team("Second Team");
newLeague.addGroup(firstTeam);
newLeague.addGroup(secondTeam);
newLeague.print();
}
}
結論
Composite Pattern適合用在想將Has a -> Is a的過程
其實在學這個Pattern時,一直覺得幹嘛不就好好設一個ArrayList,要使用它的時候從裡面找就好了。
- 如果上面的範例隊伍要在分為大隊、中隊和小隊,那只要再擴增物件就好
- 但是如果是用ArrayList則可能要改寫原本物件的架構
留言
張貼留言