Skip to content

Commit c66cc67

Browse files
committed
design pattern
1 parent 524b27c commit c66cc67

17 files changed

+480
-0
lines changed

abstract_factory.go

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package sugar
2+
3+
type Product interface {
4+
}
5+
6+
type AbstractFactory interface {
7+
Create() Product
8+
}

adapter.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package sugar
2+
3+
type Adapter struct {
4+
Adapt
5+
}
6+
7+
func (a *Adapter) Do() {
8+
a.SpecifyDo()
9+
}
10+
11+
type Adapt interface {
12+
SpecifyDo()
13+
}
14+
15+
type AdaptImpl struct {
16+
}
17+
18+
func (a AdaptImpl) SpecifyDo() {
19+
20+
}
21+
22+
type Target interface {
23+
Do()
24+
}
25+
26+
func NewAdapter() Target {
27+
return &Adapter{AdaptImpl{}}
28+
}

composite.go

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package sugar
2+
3+
import "fmt"
4+
5+
type Component interface {
6+
Parent() Component
7+
SetParent(Component)
8+
Name() string
9+
SetName(string)
10+
AddChild(Component)
11+
Print(string)
12+
}
13+
14+
const (
15+
LeafNode = iota
16+
CompositeNode
17+
)
18+
19+
func NewComponent(kind int, name string) Component {
20+
var c Component
21+
switch kind {
22+
case LeafNode:
23+
c = NewLeaf()
24+
case CompositeNode:
25+
c = NewComposite()
26+
}
27+
28+
c.SetName(name)
29+
return c
30+
}
31+
32+
type component struct {
33+
parent Component
34+
name string
35+
}
36+
37+
func (c *component) Parent() Component {
38+
return c.parent
39+
}
40+
41+
func (c *component) SetParent(parent Component) {
42+
c.parent = parent
43+
}
44+
45+
func (c *component) Name() string {
46+
return c.name
47+
}
48+
49+
func (c *component) SetName(name string) {
50+
c.name = name
51+
}
52+
53+
func (c *component) AddChild(Component) {}
54+
55+
func (c *component) Print(string) {}
56+
57+
type Leaf struct {
58+
component
59+
}
60+
61+
func NewLeaf() *Leaf {
62+
return &Leaf{}
63+
}
64+
65+
func (c *Leaf) Print(pre string) {
66+
fmt.Printf("%s-%s\n", pre, c.Name())
67+
}
68+
69+
type Composite struct {
70+
component
71+
childs []Component
72+
}
73+
74+
func NewComposite() *Composite {
75+
return &Composite{
76+
childs: make([]Component, 0),
77+
}
78+
}
79+
80+
func (c *Composite) AddChild(child Component) {
81+
child.SetParent(c)
82+
c.childs = append(c.childs, child)
83+
}
84+
85+
func (c *Composite) Print(pre string) {
86+
fmt.Printf("%s+%s\n", pre, c.Name())
87+
pre += " "
88+
for _, comp := range c.childs {
89+
comp.Print(pre)
90+
}
91+
}

composite_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//go:build ignore
2+
// +build ignore
3+
4+
package sugar
5+
6+
func ExampleComposite() {
7+
root := NewComponent(CompositeNode, "root")
8+
c1 := NewComponent(CompositeNode, "c1")
9+
c2 := NewComponent(CompositeNode, "c2")
10+
c3 := NewComponent(CompositeNode, "c3")
11+
12+
l1 := NewComponent(LeafNode, "l1")
13+
l2 := NewComponent(LeafNode, "l2")
14+
l3 := NewComponent(LeafNode, "l3")
15+
16+
root.AddChild(c1)
17+
root.AddChild(c2)
18+
c1.AddChild(c3)
19+
c1.AddChild(l1)
20+
c2.AddChild(l2)
21+
c2.AddChild(l3)
22+
23+
root.Print("")
24+
// Output:
25+
// +root
26+
// +c1
27+
// +c3
28+
// -l1
29+
// +c2
30+
// -l2
31+
// -l3
32+
}

concurrency.go

+30
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,33 @@ func FanIn(in ...chan any) <-chan any {
4343
}
4444
return out
4545
}
46+
47+
func FanOut(ch <-chan any, n int) []chan any {
48+
cs := make([]chan any, 0, n)
49+
for i := 0; i < n; i++ {
50+
cs = append(cs, make(chan any))
51+
}
52+
distributeToChannels := func(ch <-chan any, cs []chan any) {
53+
defer func(cs []chan any) {
54+
for _, c := range cs {
55+
close(c)
56+
}
57+
}(cs)
58+
59+
for {
60+
for _, c := range cs {
61+
select {
62+
case val, ok := <-ch:
63+
if !ok {
64+
return
65+
}
66+
67+
c <- val
68+
}
69+
}
70+
}
71+
}
72+
go distributeToChannels(ch, cs)
73+
74+
return cs
75+
}

creational.go

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package sugar
2+
3+
type Builder interface {
4+
Build(m any) Builder
5+
CompletedCheck() bool
6+
}

creational_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//go:build ignore
2+
// +build ignore
3+
4+
package sugar
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
)
10+
11+
type BuilderImplCase struct {
12+
M1 any
13+
}
14+
15+
func (b *BuilderImplCase) Build(m any) Builder {
16+
b.M1 = m
17+
return b
18+
}
19+
20+
func (b *BuilderImplCase) CompletedCheck() bool {
21+
if !IsNil1(b.M1) {
22+
return true
23+
}
24+
return false
25+
}
26+
27+
func TestBuilderImplCase(t *testing.T) {
28+
v := &BuilderImplCase{}
29+
completedCheck := v.Build("m").CompletedCheck()
30+
if completedCheck {
31+
fmt.Println("complete!")
32+
}
33+
}

decorate.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package sugar
2+
3+
func DecorateFn(before, fn, after func()) func() {
4+
return func() {
5+
before()
6+
fn()
7+
after()
8+
}
9+
}

idiom.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package sugar
2+
3+
func Idiom(member any) func(obj any) {
4+
return func(obj any) {
5+
6+
}
7+
}

judge_nil.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package sugar
2+
3+
import "reflect"
4+
5+
// IsNil1 ...
6+
func IsNil1(i interface{}) bool {
7+
ret := i == nil
8+
if !ret {
9+
defer func() {
10+
recover()
11+
}()
12+
ret = reflect.ValueOf(i).IsNil()
13+
}
14+
return ret
15+
}
16+
17+
// IsNil2 ...
18+
func IsNil2(i interface{}) bool {
19+
if i == nil {
20+
return true
21+
}
22+
v := reflect.ValueOf(i)
23+
switch v.Kind() {
24+
case reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, reflect.UnsafePointer, reflect.Interface, reflect.Slice:
25+
return v.IsNil()
26+
default:
27+
return false
28+
}
29+
}

mediator.go

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package sugar
2+
3+
//Mediator a FSM implement
4+
5+
type Mediator struct {
6+
transitions map[Member][]Member
7+
}
8+
9+
var (
10+
gMediator *Mediator
11+
)
12+
13+
func GetMediator() *Mediator {
14+
if gMediator == nil {
15+
gMediator = &Mediator{make(map[Member][]Member)}
16+
}
17+
return gMediator
18+
}
19+
20+
func (m *Mediator) Changed(i Member) {
21+
for _, member := range m.transitions[i] {
22+
member.Process(i.GetTransData())
23+
}
24+
}
25+
26+
func (m *Mediator) RegisterMember(from, to Member) {
27+
if m.transitions[from] == nil {
28+
m.transitions[from] = make([]Member, 0)
29+
}
30+
m.transitions[from] = append(m.transitions[from], to)
31+
}
32+
33+
type Member interface {
34+
Process(a any)
35+
GetTransData() any
36+
}

0 commit comments

Comments
 (0)