需求:使用任何一种您熟悉的面向对象语言写一个计算器(加减乘除)
分析:有四个方法,分别是加法、减法、乘法、除法。要达到最大的解耦合,就必须将计算逻辑与输出分离。四个方法要相对独立,不互相影响。故此设计了这个UML图。
图片上传失败,请问各位大侠,我要怎么操作才能将UML截图放在这里?
接口类:calculatorInterface.go
```javascript
package simple_factory
type CalculateEngine interface {
Calculate(num1, num2 float64) float64
}
```
实现类:calculatorRealization.go
```javascript
package simple_factory
// 加法
type Add struct {
}
func (Add) Calculate(num1, num2 float64) float64 {
return num1 + num2
}
// 减法
type Sub struct {
}
func (Sub) Calculate(num1, num2 float64) float64 {
return num1 - num2
}
// 乘法
type Mul struct {
}
func (Mul) Calculate(num1, num2 float64) float64 {
return num1 * num2
}
// 除法
type Div struct {
}
func (Div) Calculate(num1, num2 float64) float64 {
if 0 == num2 {
panic("除数为0")
}
return num1 / num2
}
```
工厂类:calculatorFactory.go
```javascript
package simple_factory
func GetCalculateEngine(str string) CalculateEngine {
switch str {
case "+":
return Add{}
case "-":
return Sub{}
case "*":
return Mul{}
case "/":
return Div{}
default:
panic("目前只支持 +-*/ 运算")
}
}
```
测试类:calculatorFactory_test.go
```javascript
package simple_factory
import (
"fmt"
"testing"
)
func Test_CalculateEngine(t *testing.T) {
engine := GetCalculateEngine("+")
fmt.Println("add:", engine.Calculate(2, 4))
engine = GetCalculateEngine("-")
fmt.Println("sub:", engine.Calculate(3, 1))
engine = GetCalculateEngine("*")
fmt.Println("mul:", engine.Calculate(3, 2))
engine = GetCalculateEngine("/")
fmt.Println("div:", engine.Calculate(3, 2))
}
```
测试结果:
```javascript
add: 6
sub: 2
mul: 6
div: 1.5
PASS
```
改进:每次获取计算引擎时都会返回一个新的实体,可以将calculatorFactory.go修改为下面这样:
```javascript
package simple_factory
var add Add
var sub Sub
var mul Mul
var div Div
func GetCalculateEngine(str string) CalculateEngine {
switch str {
case "+":
return add
case "-":
return sub
case "*":
return mul
case "/":
return div
default:
panic("目前只支持 +-*/ 运算")
}
}
```
有疑问加站长微信联系(非本文作者)