複合パターンは構造設計パターンを指し、国内情報源では「コンポジター」として知られています。
アプリケーションを開発しているとします。写真アルバム。ユーザーはフォルダーを作成し、そこに写真を追加したり、その他の操作を実行したりできます。フォルダー内のファイルの数、すべてのファイルとフォルダーの合計数を表示する機能は必ず必要です。
ツリーを使用する必要があることは明らかですが、シンプルで便利なインターフェイスを備えたツリー アーキテクチャを実装するにはどうすればよいでしょうか?複合パターンが役に立ちます。
必要な dataCount() メソッドを使用してコンポーネント インターフェイスを実装します。これにより、ファイル/ディレクトリの数が返されます。パターンに従って Component インターフェイスを実装するクラスのインスタンスを追加/削除できるインターフェイスを備えた Directory クラスを作成しましょう。これは Composite です。また、File クラスも作成します。このクラスでは、写真カードでバイトを保存し、Component から継承し、dataCount を通じて 1 を返し、写真が 1 枚しかないことを示します。
次に、ディレクトリに dataCount() メソッドを実装します –コンポーネントの配列にあるすべての要素を調べて、それらの dataCount をすべて合計します。
準備は完了です!
以下は Go の例です。
package main
import "fmt"
type component interface {
dataCount() int
}
type file struct {
}
type directory struct {
c []component
}
func (f file) dataCount() int {
return 1
}
func (d directory) dataCount() int {
var outputDataCount int = 0
for _, v := range d.c {
outputDataCount += v.dataCount()
}
return outputDataCount
}
func (d *directory) addComponent(c component) {
d.c = append(d.c, c)
}
func main() {
var f file
var rd directory
rd.addComponent(f)
rd.addComponent(f)
rd.addComponent(f)
rd.addComponent(f)
fmt.Println(rd.dataCount())
var sd directory
sd.addComponent(f)
rd.addComponent(sd)
rd.addComponent(sd)
rd.addComponent(sd)
fmt.Println(sd.dataCount())
fmt.Println(rd.dataCount())
}
ソース
https://refactoring.guru/ru/design-patterns/複合
