天天一個設計模式·策略模式

0. 項目地址

做者按:《天天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript靠這吃飯)和python純粹喜歡)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :)javascript

1. 什麼是策略模式?

策略模式定義:就是可以把一系列「可互換的」算法封裝起來,並根據用戶需求來選擇其中一種。java

策略模式實現的核心就是:將算法的使用和算法的實現分離。算法的實現交給策略類。算法的使用交給環境類,環境類會根據不一樣的狀況選擇合適的算法。python

2. 策略模式優缺點

在使用策略模式的時候,須要瞭解全部的「策略」(strategy)之間的異同點,才能選擇合適的「策略」進行調用。git

3. 代碼實現

3.1 python3實現

class Stragegy():
  # 子類必須實現 interface 方法
  def interface(self):
    raise NotImplementedError()

# 策略A
class StragegyA():
  def interface(self):
    print("This is stragegy A")

# 策略B
class StragegyB():
  def interface(self):
    print("This is stragegy B")

# 環境類:根據用戶傳來的不一樣的策略進行實例化,並調用相關算法
class Context():
  def __init__(self, stragegy):
    self.__stragegy = stragegy()
  
  # 更新策略
  def update_stragegy(self, stragegy):
    self.__stragegy = stragegy()
  
  # 調用算法
  def interface(self):
    return self.__stragegy.interface()


if __name__ == "__main__":
  # 使用策略A的算法
  cxt = Context( StragegyA )
  cxt.interface()

  # 使用策略B的算法
  cxt.update_stragegy( StragegyB )
  cxt.interface()

3.2 javascript實現

// 策略類
const strategies = {
  A() {
    console.log("This is stragegy A");
  },
  B() {
    console.log("This is stragegy B");
  }
};

// 環境類
const context = name => {
  return strategies[name]();
};

// 調用策略A
context("A");
// 調用策略B
context("B");

4. 參考

相關文章
相關標籤/搜索