Golang 選項模式(Option模式)


Option模式的專業術語為:Functional Options Pattern(函數式選項模式)
Option模式為golang的開發者提供了將一個函數的參數設置為可選的功能,也就是說我們可以選擇參數中的某幾個,並且可以按任意順序傳入參數。
比如針對特殊場景需要不同參數的情況,C++可以直接用重載來寫出任意個同名函數,在任意場景調用的時候使用同一個函數名即可;但同樣情況下,在golang中我們就必須在不同的場景使用不同的函數,並且參數傳遞方式可能不同的人寫出來是不同的樣子,這將導致代碼可讀性差,維護性差。

Option模式的優缺點

優點

  1. 支持傳遞多個參數,並且在參數個數、類型發生變化時保持兼容性
  2. 任意順序傳遞參數
  3. 支持默認值
  4. 方便拓展

缺點

  1. 增加許多function,成本增大
  2. 參數不太復雜時,盡量少用

Option模式demo

package main

// fixme : url https://blog.csdn.net/lazyboy_/article/details/103289750

import "fmt"

type Message struct {
	id      int
	name    string
	address string
	phone   int
}

func (msg Message) String() {
	fmt.Printf("ID:%d \n- Name:%s \n- Address:%s \n- phone:%d\n", msg.id, msg.name, msg.address, msg.phone)
}

func New(id, phone int, name, addr string) Message {
	return Message{
		id:      id,
		name:    name,
		address: addr,
		phone:   phone,
	}
}

type Option func(msg *Message)

var DEFAULT_MESSAGE = Message{id: -1, name: "-1", address: "-1", phone: -1}

func WithID(id int) Option {
	return func(m *Message) {
		m.id = id
	}
}

func WithName(name string) Option {
	return func(m *Message) {
		m.name = name
	}
}

func WithAddress(addr string) Option {
	return func(m *Message) {
		m.address = addr
	}
}

func WithPhone(phone int) Option {
	return func(m *Message) {
		m.phone = phone
	}
}

func NewByOption(opts ...Option) Message {
	msg := DEFAULT_MESSAGE
	for _, o := range opts {
		o(&msg)
	}
	return msg
}

func NewByOptionWithoutID(id int, opts ...Option) Message {
	msg := DEFAULT_MESSAGE
	msg.id = id
	for _, o := range opts {
		o(&msg)
	}
	return msg
}

func main() {
	message1 := New(1, 123, "message1", "cache1")
	message1.String()
	message2 := NewByOption(WithID(2), WithName("message2"), WithAddress("cache2"), WithPhone(456))
	message2.String()
	message3 := NewByOptionWithoutID(3, WithAddress("cache3"), WithPhone(789), WithName("message3"))
	message3.String()
}

/* 
Output
ID:1 
- Name:message1 
- Address:cache1 
- phone:123
ID:2 
- Name:message2 
- Address:cache2 
- phone:456
ID:3 
- Name:message3 
- Address:cache3 
- phone:789
*/

  轉載自 :https://blog.csdn.net/lazyboy_/article/details/103289750


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM