最近在看《大話設計模式》,這本書通過對話形式講解設計模式的使用場景,有興趣的可以去看一下,
第一篇講的是簡單工廠模式,要求輸入兩個數和運算子號,得到運行結果,
這個需求不難,難就難在類要怎么設計,才能達到可復用、維護性強、可拓展和靈活性高,
運算子可能是加、減、乘、除,未了方便以后可以拓展其它運算子,這里可以宣告一個抽象介面,通過簡單工廠設計模式回傳不通的運算類,
package operate
type IOperate interface {
GetResult(a int, b int) int
}
首先宣告一個IOperate抽象介面表示運算,然后新建Add、Sub、Mul和Div結構體實作這個運行介面:
package operate
type Add struct{}
func (o Add) GetResult(a int, b int) int {
return a + b
}
type Sub struct{}
func (o Sub) GetResult(a int, b int) int {
return a - b
}
type Mul struct{}
func (o Mul) GetResult(a int, b int) int {
return a * b
}
type Div struct{}
func (o Div) GetResult(a int, b int) int {
if b == 0 {
panic("除數不能為0")
}
return a / b
}
然后定義一個工廠,引數為運算子號:
package main
// NewOperate 按照運算子號創建操作物件
func NewOperate(o string) operate.IOperate {
switch o {
case "+":
return operate.Add{}
case "-":
return operate.Sub{}
case "*":
return operate.Mul{}
case "/":
return operate.Div{}
default:
panic("運算子號錯誤")
}
}
最后運行:
package main
import "fmt"
func main() {
var a, b int
fmt.Println("請輸入兩個數:")
fmt.Scanf("%d %d", &a, &b)
fmt.Println("請輸入運算子號(+、-、*、/):")
var operate string
fmt.Scanf("%s", &operate)
operateObj := NewOperate(operate)
result := operateObj.GetResult(a, b)
fmt.Printf("%d %s %d = %d\n", a, operate, b, result)
}
要增加不同的運算操作只需要新增實作了抽象運算介面的結構體和修改工廠,因為go語言的函式也是一種型別,其實上面的代碼可以簡化,不用每次都新增一個結構體:
type OperateFun func(a, b int) int
// GetOperateFunc 按照運算子號創建操作函式,函式式編程
func GetOperateFunc(o string) OperateFun {
switch o {
case "+":
return func(a, b int) int {
return a + b
}
case "-":
return func(a, b int) int {
return a - b
}
case "*":
return func(a, b int) int {
return a * b
}
case "/":
return func(a, b int) int {
if b == 0 {
panic("除數不能為0")
}
return a / b
}
default:
panic("運算子號錯誤")
}
main函式可以這樣呼叫:
var a, b int
fmt.Println("請輸入兩個數:")
fmt.Scanf("%d %d", &a, &b)
fmt.Println("請輸入運算子號(+、-、*、/):")
var operate string
fmt.Scanf("%s", &operate)
operateFun := GetOperateFunc(operate)
result = operateFun(a, b)
fmt.Printf("%d %s %d = %d\n", a, operate, b, result)
寫業務代碼還是要多想一下用什么設計模式合適,避免撰寫的代碼后面不好維護和擴展,這需要多練習,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552491.html
標籤:其他
下一篇:返回列表
