adjust structure & finish option mode

This commit is contained in:
Edward 2020-04-27 10:27:37 +08:00
parent 5a2722337a
commit 9f56436745
7 changed files with 119 additions and 115 deletions

View File

@ -1,8 +1,6 @@
# Go 语言设计模式示例集合 # 语言设计模式示例集合(Go Patterns Examples)
参考资料:[大话设计模式](https://book.douban.com/subject/2334288/) | [图解设计模式](https://book.douban.com/subject/26933281/) | [菜鸟教程—设计模式](https://www.runoob.com/design-pattern/design-pattern-tutorial.html) Go常用的、面向工程化和最佳实践的模式套路包含常见的23种设计模式,重点是这里全部是例子、通俗易懂,每个模式,改一下名字就可以直接用在项目和工程中.
[![Build Status](https://travis-ci.org/senghoo/golang-design-pattern.svg?branch=master)](https://travis-ci.org/senghoo/golang-design-pattern)
## 姿势 ## 姿势
@ -12,43 +10,49 @@
## 创建型模式 ## 创建型模式
+ [简单工厂模式Simple Factory](./creation/00_simple_factory) + [简单工厂模式(Simple Factory)](./creation/00_simple_factory)
+ [工厂方法模式Factory Method](./creation/04_factory_method) + [工厂方法模式(Factory Method)](./creation/04_factory_method)
+ [抽象工厂模式Abstract Factory](./creation/05_abstract_factory) + [抽象工厂模式(Abstract Factory)](./creation/05_abstract_factory)
+ [创建者模式Builder](./creation/06_builder) + [创建者模式(Builder)](./creation/06_builder)
+ [原型模式Prototype](./creation/07_prototype) + [原型模式(Prototype)](./creation/07_prototype)
+ [单例模式Singleton](./creation/03_singleton) + [单例模式(Singleton)](./creation/03_singleton)
+ [对象池模式(OBject Pool)](./creation/24_object_pool)
+ [New模式(New)](./creation/25_new)
## 结构型模式 ## 结构型模式
+ [外观模式Facade](./01_facade) + [外观模式(Facade)](./structure/01_facade)
+ [适配器模式Adapter](./02_adapter) + [适配器模式(Adapter)](./structure/02_adapter)
+ [代理模式Proxy](./09_proxy) + [代理模式(Proxy)](./structure/09_proxy)
+ [组合模式Composite](./13_composite) + [组合模式(Composite)](./structure/13_composite)
+ [享元模式Flyweight](./18_flyweight) + [享元模式(Flyweight)](./structure/18_flyweight)
+ [装饰模式Decorator](./20_decorator) + [装饰模式(Decorator)](./structure/20_decorator)
+ [桥模式Bridge](./22_bridge) + [桥模式(Bridge)](./structure/22_bridge)
## 行为型模式 ## 行为型模式
+ [中介者模式Mediator](./08_mediator) + [中介者模式(Mediator)](./behavior/08_mediator)
+ [观察者模式Observer](./10_observer) + [观察者模式(Observer)](./behavior/10_observer)
+ [命令模式Command](./11_command) + [命令模式(Command)](./behavior/11_command)
+ [迭代器模式Iterator](./12_iterator) + [迭代器模式(Iterator)](./behavior/12_iterator)
+ [模板方法模式Template Method](./14_template_method) + [模板方法模式(Template Method)](./behavior/14_template_method)
+ [策略模式Strategy](./15_strategy) + [策略模式(Strategy)](./behavior/15_strategy)
+ [状态模式State](./16_state) + [状态模式(State)](./behavior/behavior16_state)
+ [备忘录模式Memento](./17_memento) + [备忘录模式(Memento)](./behavior/17_memento)
+ [解释器模式Interpreter](./19_interpreter) + [解释器模式(Interpreter)](./behavior/19_interpreter)
+ [职责链模式Chain of Responsibility](./21_chain_of_responsibility) + [职责链模式(Chain of Responsibility)](./behavior/21_chain_of_responsibility)
+ [访问者模式Visitor](./23_visitor) + [访问者模式(Visitor)](./behavior/23_visitor)
+ [闭包选项模式(Function Option)](./behavior/26_option)
## Design patters Articles ## 参考资(Design patters Articles)
[GO模式](https://github.com/tmrts/go-patterns) [大话设计模式](https://book.douban.com/subject/2334288/)
[参考代码1](https://github.com/tmrts/go-patterns) [GO模式文档](https://github.com/tmrts/go-patterns)
[参考代码2](https://github.com/senghoo/golang-design-pattern)
[菜鸟教程—设计模式](https://www.runoob.com/design-pattern/design-pattern-tutorial.html)
[GO设计模式](https://github.com/senghoo/golang-design-pattern)
## 更多 ## 更多

View File

@ -0,0 +1,3 @@
# 说明
Option模式又称万能用于参数传递和初始化的创建模式一般常常与New模式配合使用同时具有Builder模式的一些特点创建对象更灵活.

View File

@ -0,0 +1,15 @@
package option
import (
"testing"
)
func TestFileFunctionOptions(t *testing.T) {
Introduce("tom", Gender(true), Company("land company"))
Introduce("lily", Company("sky commnay"), UID(123))
Introduce("admin", Company("risky commnay"), UID(883))
}

View File

@ -0,0 +1,65 @@
package option
import (
"fmt"
)
//Options is key struct,关键数据结构,聚合所有外部可传入的参数
type Options struct {
UID int
GID int
Flags int
Company string
Gender bool //is male
}
//Option func is key func
type Option func(*Options)
//UID set User ID
func UID(userID int) Option {
return func(args *Options) {
args.UID = userID
}
}
//GID set User Group ID
func GID(groupID int) Option {
return func(args *Options) {
args.GID = groupID
}
}
//Company set Company Name
func Company(cname string) Option {
return func(args *Options) {
args.Company = cname
}
}
//Gender for male or female
func Gender(gender bool) Option {
return func(args *Options) {
args.Gender = gender
}
}
//Introduce someone
func Introduce(name string, setters ...Option /*传入闭包设置函数*/) {
// Default Options
args := &Options{
UID: 0,
GID: 0,
Company: "",
Gender: true,
}
for _, setter := range setters {
setter(args)
}
gender := "famale"
if args.Gender {
gender = "male"
}
fmt.Println("----------------------")
fmt.Println("im am: ", name, "\nfrom: ", args.Company, "\ngender: ", gender, "\nUID: ", args.UID)
}

View File

@ -1,83 +0,0 @@
package idiom
import (
"os"
"testing"
)
func TestFileFunctionOptions(t *testing.T) {
err := New("empty.txt")
if err != nil {
panic(err)
}
os.Remove("empty.txt")
err = New("file.txt", UID(1000), Contents("input some data"))
if err != nil {
panic(err)
}
os.Remove("file.txt")
}
///Options is key struct
type Options struct {
UID int
GID int
Flags int
Contents string
Permissions os.FileMode
}
//Option func is key func
type Option func(*Options)
func UID(userID int) Option {
return func(args *Options) {
args.UID = userID
}
}
func GID(groupID int) Option {
return func(args *Options) {
args.GID = groupID
}
}
func Contents(c string) Option {
return func(args *Options) {
args.Contents = c
}
}
func Permissions(perms os.FileMode) Option {
return func(args *Options) {
args.Permissions = perms
}
}
func New(filepath string, setters ...Option) error {
// Default Options
args := &Options{
UID: os.Getuid(),
GID: os.Getgid(),
Contents: "",
Permissions: 0666,
Flags: os.O_CREATE | os.O_EXCL | os.O_WRONLY,
}
for _, setter := range setters {
setter(args)
}
f, err := os.OpenFile(filepath, args.Flags, args.Permissions)
if err != nil {
return err
}
defer f.Close()
if _, err := f.WriteString(args.Contents); err != nil {
return err
}
return err
}