設計模式 - 組合模式 (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則可能要改寫原本物件的架構
留言
張貼留言