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

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)