From 98163f11793d94e535f1dfea8995e2eaea0f853f Mon Sep 17 00:00:00 2001 From: nynicg Date: Sun, 5 May 2019 16:08:55 +0800 Subject: [PATCH] composite pattern --- README.md | 2 +- structural/composite/main.go | 68 ++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 structural/composite/main.go diff --git a/README.md b/README.md index 11d4e51..552ec2a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ A curated collection of idiomatic design & application patterns for Go language. | Pattern | Description | Status | |:-------:|:----------- |:------:| | [Bridge](/structural/bridge/main.go) | Decouples an interface from its implementation so that the two can vary independently | ✔ | -| [Composite](/structural/composite.md) | Encapsulates and provides access to a number of different objects | ✘ | +| [Composite](/structural/composite/main.go) | Encapsulates and provides access to a number of different objects | ✔ | | [Decorator](/structural/decorator.md) | Adds behavior to an object, statically or dynamically | ✔ | | [Facade](/structural/facade.md) | Uses one type as an API to a number of others | ✘ | | [Flyweight](/structural/flyweight.md) | Reuses existing instances of objects with similar/identical state to minimize resource usage | ✘ | diff --git a/structural/composite/main.go b/structural/composite/main.go new file mode 100644 index 0000000..9f4e043 --- /dev/null +++ b/structural/composite/main.go @@ -0,0 +1,68 @@ +// 组合模式 composite pattern. +// 用于表示树形的结构,这里以一个web静态目录为例 +package main + +type File struct { + IsDir bool + Name string + ChildFile []*File +} + +func (f *File)AddChild(file ...*File){ + f.ChildFile = append(f.ChildFile ,file...) +} + +func checkFile(file *File) { + println("into dir ->" ,file.Name) + for _ ,v := range file.ChildFile{ + if v.IsDir{ + checkFile(v) + }else{ + println("dir ->" ,file.Name ,".fileName ->" ,v.Name) + } + } +} + +func main(){ + /* + static| + -js| + -jquery.js + -main| + -index.js + -login.js + -css| + -bootstrap.css + */ + static := &File{true ,"static" ,make([]*File ,0)} + js := &File{true ,"js" ,make([]*File ,0)} + css := &File{true ,"css" ,make([]*File ,0)} + static.AddChild(js ,css) + + jquery := &File{false ,"jquery.js" ,nil} + mjs := &File{true ,"main" ,make([]*File ,0)} + js.AddChild(jquery ,mjs) + + injs := &File{false ,"index.js" ,nil} + lojs := &File{false ,"login.js" ,nil} + mjs.AddChild(injs ,lojs) + + + btstrap := &File{false ,"bootstrap.css" ,nil} + css.AddChild(btstrap) + + checkFile(static) + /* + output: + into dir -> static + into dir -> js + dir -> js .fileName -> jquery.js + into dir -> main + dir -> main .fileName -> index.js + dir -> main .fileName -> login.js + into dir -> css + dir -> css .fileName -> bootstrap.css + */ +} + +