겨울 세일!
복합체

Go로 작성된 복합체

복합체 패턴은 객체들을 트리 구조들로 구성한 후, 이러한 구조들을 개별 객체들처럼 다룰 수 있도록 하는 구조 패턴입니다.

복합체는 트리 구조를 생성해야 하는 대부분 문제에 대해 인기 있는 해결책입니다. 전체 트리 구조에 대해 재귀적으로 메서드들을 실행하고 결과를 요약하는 기능은 복합체의 훌륭한 기능 중 하나입니다.

개념적인 예시

운영 체제의 파일 시스템을 예시로 들어 복합체 패턴을 이해해 봅시다. 예시의 파일 시스템에는 파일과 폴더라는 두 가지 유형의 객체가 있으며 때로는 파일과 폴더를 같은 방식으로 취급해야 하는 경우가 있는데 이럴 때 복합체 패턴이 유용합니다.

파일 시스템에서 특정 키워드에 대한 검색을 실행해야 한다고 상상해 보세요. 이 검색 작업은 파일과 폴더 모두에 적용됩니다. 파일의 경우 파일 내용만 살펴보나 폴더의 경우 검색된 키워드를 찾기 위해 해당 폴더의 모든 파일을 탐색합니다.

component.go: 컴포넌트 인터페이스

package main

type Component interface {
	search(string)
}

folder.go: 복합체

package main

import "fmt"

type Folder struct {
	components []Component
	name       string
}

func (f *Folder) search(keyword string) {
	fmt.Printf("Serching recursively for keyword %s in folder %s\n", keyword, f.name)
	for _, composite := range f.components {
		composite.search(keyword)
	}
}

func (f *Folder) add(c Component) {
	f.components = append(f.components, c)
}

file.go:

package main

import "fmt"

type File struct {
	name string
}

func (f *File) search(keyword string) {
	fmt.Printf("Searching for keyword %s in file %s\n", keyword, f.name)
}

func (f *File) getName() string {
	return f.name
}

main.go: 클라이언트 코드

package main

func main() {
	file1 := &File{name: "File1"}
	file2 := &File{name: "File2"}
	file3 := &File{name: "File3"}

	folder1 := &Folder{
		name: "Folder1",
	}

	folder1.add(file1)

	folder2 := &Folder{
		name: "Folder2",
	}
	folder2.add(file2)
	folder2.add(file3)
	folder2.add(folder1)

	folder2.search("rose")
}

output.txt: 실행 결과

Serching recursively for keyword rose in folder Folder2
Searching for keyword rose in file File2
Searching for keyword rose in file File3
Serching recursively for keyword rose in folder Folder1
Searching for keyword rose in file File1

다른 언어로 작성된 복합체

C#으로 작성된 복합체 C++로 작성된 복합체 자바로 작성된 복합체 PHP로 작성된 복합체 파이썬으로 작성된 복합체 루비로 작성된 복합체 러스트로 작성된 복합체 스위프트로 작성된 복합체 타입스크립트로 작성된 복합체