Composite

デザインパターンとは

デザインパターンとはオブジェクト思考開発における先人たちが作り上げてきた便利な設計図です。

Gang of Four通称Gofが1994年に出版した『オブジェクト指向における再利用のためのデザインパターン』の中で23個の設計図が紹介されています。

Note

デザインパターンのサンプルコードはSwift4でまとめます。

コンポジットパターンとは?

Compositeパターンは中身を同一視するパターンです。
中身が同一であることが保証されることで、全てのオブジェクトに同じ処理を行うことができます

サンプルコード

サンプルコードでは食器の洗い場を例にプログラムを作成しました。

 洗い場には様々な汚れた食器がたまっていますが、全ての食器を洗ます。お皿、丼、お箸各オブジェクトの形や機能は異なっていますが、洗い物として同一視することで洗います。

Protocol

プロトコルはとてもシンプルです。washメソッドだけを準拠させます、WashingDishesを準拠させた食器は洗うことができるようになります。

protocol WashingDishes {
    func wash()
}

洗い物オブジェクトたち

お皿、丼、お箸の3つのクラスを用意しました。

class Dish: WashingDishes {
    func wash() {
        print("お皿を洗いました!")
    }
}

class Bowl: WashingDishes {
    func wash() {
        print("丼を洗いました!")
    }
}

class Chopsticks: WashingDishes {
    func wash() {
        print("お箸を洗いました!")
    }
}

洗い場クラス

お皿達を実際に洗うのはこのクラスです。汚れたお皿をaddメソッド追加していき、washメソッドでリストに持っている食器を全て洗います。

class Washroom: WashingDishes {
    private var dirtyItems:[WashingDishes] = []
    func wash() {
        for item in dirtyItems {
            item.wash()
        }
    }
    func add(item: WashingDishes) {
        dirtyItems.append(item)
    }
}

呼び出し元

let dish1 = Dish()
let dish2 = Dish()
let bowl = Bowl()
let chopsticks = Chopsticks()

var washroom = Washroom()
//洗い場に汚れた食器を追加
washroom.add(item: dish1)
washroom.add(item: dish2)
washroom.add(item: bowl)
washroom.add(item: chopsticks)

//全ての食器を洗う!
washroom.wash()

コンソール

お皿を洗いました!
お皿を洗いました!
丼を洗いました!
お箸を洗いました!

コード一覧

import UIKit

protocol WashingDishes {
    func wash()
}

class Dish: WashingDishes {
    func wash() {
        print("お皿を洗いました!")
    }
}

class Bowl: WashingDishes {
    func wash() {
        print("丼を洗いました!")
    }
}

class Chopsticks: WashingDishes {
    func wash() {
        print("お箸を洗いました!")
    }
}

class Washroom: WashingDishes {
    private var dirtyItems:[WashingDishes] = []
    func wash() {
        for item in dirtyItems {
            item.wash()
        }
    }
    func add(item: WashingDishes) {
        dirtyItems.append(item)
    }
}

let dish1 = Dish()
let dish2 = Dish()
let bowl = Bowl()
let chopsticks = Chopsticks()

var washroom = Washroom()
//洗い場に汚れた食器を追加
washroom.add(item: dish1)
washroom.add(item: dish2)
washroom.add(item: bowl)
washroom.add(item: chopsticks)

//全ての食器を洗う!
washroom.wash()

参考文献

増補改訂版 Java言語で学ぶデザインパターン入門 

Composite パターン

Swiftで学ぶデザインパターン13 (Compositeパターン)