策略设计模式Golang

Strategy 策略

该模式定义一些列算法, 并将算法封装到一起.

优点:

  1. 多重条件语句不易维护, 而使用策略模式可以避免使用多重条件语句.
  2. 策略模式提供一些列的重用算法组, 恰当使用继承可以吧算法组公用代码转移到父类里面. 从而避免代码的重复.
  3. 策略模式可以提供相同行为的不同实现, 客户可以根据不同时间或空间要求选择的不同.
  4. 策略模式可以提供开闭原则的完美支持, 可以不修改源码的情况下,灵魂增加算法.
  5. 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

缺点:

  1. 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
  2. 策略模式造成很多的策略类。

应用场景:

  1. 旅行出游的时候,选择骑自行车,坐汽车,
  2. 诸葛钢铁有很多锦囊妙计,每一个荷包都是一个策略.
  3. 选择不同种类的支付.

使用场景:

  1. 如在一个系统有很慢类,它之间的区别只是区别于他们的行为,那么使用策略模式可以动态让一个对象在许多行为中选择一种行为.
  2. 一个系统需要动态的几种算法中选择一种.


关于支付的分析图

代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
type Payment interface {
Pay(money int64) error
Refund(money int64) error
}

type Alipay struct {
}

func (a *Alipay) Pay(money int64) (err error) {
fmt.Printf("Pay by Alipay %d", money)
return
}

func (a *Alipay) Refund(money int64) (err error) {
fmt.Printf("Refund by Alipay %d", money)
return
}

type WechatPay struct {
}

func (w *WechatPay) Pay(money int64) (err error) {
fmt.Printf("Pay by WechatPay %d", money)
return
}

func (w *WechatPay) Refund(money int64) (err error) {
fmt.Printf("Refund by WechatPay %d", money)
return
}
type BankPay struct {
}

func (w *BankPay) Pay(money int64) (err error) {
fmt.Printf("Pay by BankPay %d", money)
return
}

func (w *BankPay) Refund(money int64) (err error) {
fmt.Printf("Refund by BankPay %d", money)
return
}

type PayType struct {
use Payment
}

func (u *PayType) SetPayment(payment Payment) {
u.use = payment
}

func (u *PayType) Pay() error {
return u.use.Pay(10)
}

func (u *PayType) Refund() error {
return u.use.Refund(10)
}
1
2
3
4
5
6
7
8
9

func TestStrategy(t *testing.T) {
a := assert.New(t)
p := PayType{}

p.SetPayment(&Alipay{})
a.Equal("Pay by Alipay 10", p.Pay())
a.Equal("Refund by Alipay 10", p.Pay())
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2018 - 2021 Noonde All Rights Reserved.

UV : | PV :