1、面向對象編程編程
一、可維護性架構
當往後代碼須要修改邏輯的時候,只須要修改某些類或者增長某些類,對主程序和大部分代碼不須要修改,體現爲可維護性。函數
二、可複用性學習
將必定的代碼進行封裝,在多處能夠重複使用。spa
三、可擴展性對象
當增長新的功能模塊時,只須要增長某些代碼,對總體代碼架構不須要作太多修改。blog
四、高靈活性繼承
經過封裝、繼承、多態把程序的耦合度下降,耦合度下降後,使代碼的使用更加靈活,更容易修改,易於複用。接口
2、簡單工廠模式的實現——以計算器功能爲例字符串
學習的來源是程傑的《大話數據模式》,書中的例子比較易懂,故事也具備連續性。本文的語言繼續使用我最近學習的Go語言。
首先先寫一個計算器操做的接口:
type Operation interface { GetResult(numberA float32, numberB float32) (float32, error) }
其中有一個函數GetResult(),接收兩個float32的參數numberA和numberB,返回一個float32的結果和error的錯誤格式(多返回值是Go語言的特性)。同時Go語言的非侵入式繼承也規定了,只要某個類實現了接口的全部方式,就等因而實現了該接口。
下面咱們寫最基本的加減乘除類:
// 加法操做類 type OperationAdd struct { } // 實現GetResult方法 func (o *OperationAdd) GetResult(numberA float32, numberB float32) (float32,error) { return numberA + numberB, nil } // 減法操做類 type OperationSub struct { } // 實現GetResult方法 func (o *OperationSub) GetResult(numberA float32, numberB float32) (float32,error) { return numberA - numberB, nil } // 乘法操做類 type OperationMul struct { } // 實現GetResult方法 func (o *OperationMul) GetResult(numberA float32, numberB float32) (float32,error) { return numberA * numberB, nil } // 除法操做類 type OperationDiv struct { } // 實現GetResult方法 func (o *OperationDiv) GetResult(numberA float32, numberB float32) (float32,error) { if numberB == 0 { return 0, nil } return numberA / numberB, nil }
各方法都實現了GetResult()方法後,已是實現了Operation接口。
由面向對象多態的性質,咱們編寫簡單工廠類:
// 操做工廠類 type OperationFactory struct { } func (o *OperationFactory) CreateOperation(operation string) (oper Operation) { switch operation { case "+": oper = new(OperationAdd) case "-": oper = new(OperationSub) case "*": oper = new(OperationMul) case "/": oper = new(OperationDiv) } return }
oper是Operation類型,因爲OpeartionAdd、OpeartionSub、OpeartionMul和OpeartionDiv都實現了Opeartion,因此能夠賦值給oper。工廠類就提供了一個方法,根據傳入的字符串,返回適合的對象。
下面編寫主程序:
func main() { factory := new(OperationFactory) operation := factory.CreateOperation("+") fmt.Println(operation.GetResult(6,2)) operation = factory.CreateOperation("-") fmt.Println(operation.GetResult(6,2)) operation = factory.CreateOperation("*") fmt.Println(operation.GetResult(6,2)) operation = factory.CreateOperation("/") fmt.Println(operation.GetResult(6,2)) }
可見,一樣的operation對象,調用GetResult()方法,獲得的結果不一樣,形成結果不一樣的緣由在於工廠對你傳入的"+"、"-"、"*"和"/"進行判斷返回了不一樣的對象。
這樣,下次咱們須要修改需求或者增長需求的時候,就只須要增長或者修改部分類的代碼就能夠了。
以增長平方操做爲例,咱們首先須要新寫一個OperationPower類,實現Operation接口。在OperationFactory工廠類中增長case判斷,再在主程序中添加操做即可。整個代碼的耦合度大大下降,靈活性也獲得了提升。