国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解Python設計模式編程中觀察者模式與策略模式的運用

詳解Python設計模式編程中觀察者模式與策略模式的運用

2020-08-15 11:56Blue Wish Python

這篇文章主要介紹了Python設計模式編程中觀察者模式與策略模式的運用,觀察者模式和策略模式都可以歸類為結構型的設計模式,需要的朋友可以參考下

觀察者模式

觀察者模式:又叫發(fā)布訂閱模式,定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某一個主題對象,這個主題對象的狀態(tài)發(fā)生變化時,會通知所有觀察者對象,是他們能自動更新自己。

代碼結構

?
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
class Topic(object):
  """主題類。保存所有觀察者實例的引用,每個主題都可以有很多觀察者
  可以增加和刪除觀察者"""
  def __init__(self):
    self.obs = []
 
  def Attach(self, ob):
    self.obs.append(ob)
 
  def Detach(self, ob):
    self.obs.remove(ob)
 
  def Notify(self):
    for ob in self.obs:
      ob.Update()
 
class Observer(object):
  """抽象觀察者類,收到主題的變更通知時,更新自己"""
  def Update(self):
    raise NotImplementedError()
 
class ConcreteTopic(object):
  """一個具體主題"""
  def __init__(self):
    self.state = None
 
  def ChangeState(self, newState):
    self.state = newState
    self.Notify()
 
class ConcreteObserver(object):
  """一個具體監(jiān)聽類"""
  def __init__(self, topic):
    self.topic = topic
 
  def Update(self):
    print self.topic.state
 
def client():
  topic = ConcreteTopic()
  topic.Attach(ConcreteObserver(topic))
 
  topic.ChangeState('New State')

眾多MQ中間件都是采用這種模式的思想來實現(xiàn)的。

觀察者模式可以讓主題和觀察者之間解耦,互相之間盡可能少的依賴。不過抽象主題和抽象觀察者之間還是有耦合的。


策略模式
策略模式: 定義了算法家族,分別封裝起來,讓他們之間可以互相替換。此模式讓算法的變化不影響使用算法的客戶。

代碼框架

?
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
class Strategy(object):
  """抽象算法類"""
  def AlgorithmInterface(self):
    raise NotImplementedError()
 
class ConcreteStrategyA(Strategy):
  def AlgorithmInterface(self):
    print '算法A'
 
class ConcreteStrategyB(Strategy):
  def AlgorithmInterface(self):
    print '算法B'
 
class Context(object):
  """上下文,作用就是封裝策略的實現(xiàn)細節(jié),用戶只需要知道有哪些策略可用"""
  def __init__(self, strategy):
    # 初始化時傳入具體的策略實例
    self.strategy = strategy
 
  def ContextInterface(self):
    # 負責調用具體的策略實例的接口
    self.strategy.AlgorithmInterface()
 
def client(cond):
  # 策略模式的使用演示
  # 用戶只需要根據(jù)不同的條件,將具體的算法實現(xiàn)類傳遞給Context,
  # 然后調用Context暴露給用戶的接口就行了。
  if cond == 'A':
    context = Context(ConcreteStrategyA())
  elif cond == 'B':
    context = Context(ConcreteStrategyB())
 
  result = context.ContextInterface()

策略模式解決那類問題

在回答這個問題之前,先說下對策略模式的使用方式的感覺。上面的client函數(shù),怎么看起來就像是簡單工廠模式中的工廠函數(shù)呢?確實如此,實際上策略模式可以和簡工廠模式結合起來,將更多細節(jié)封裝在策略模式內(nèi)部,讓使用者更容易的使用。

那么策略模式和簡單工廠模式有什么不同呢?策略模式中的算法是用來解決同一個問題的,根據(jù)時間、條件不同,算法的具體細節(jié)有差異,但最終解決的是同一個問題。在需求分析過程中,當聽到需要在不同時間應用不同的業(yè)務規(guī)則,就可以考慮使用策略模式來處理這種變化的可能性。

缺點

使用者需要知道每一種策略的具體含義,并負責選擇策略
改進

結合簡單工廠模式,將策略選擇封裝在Context內(nèi)部,解放client:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Context(object):
  def __init__(self, cond):
    if cond == 'A':
      self.strategy = Context(ConcreteStrategyA())
    elif cond == 'B':
      self.strategy = Context(ConcreteStrategyB())
 
  def ContextInterface(self):
    self.strategy.AlgorithmInterface()
 
 
def client(cond):
  context = Context(cond)
  result = context.ContextInterface()

改進后的遺留問題

每次需要增加新的策略時,就需要修改Context的構造函數(shù),增加一個新的判斷分支。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精选一区二区 | 黄色在线免费 | 亚洲国产美女视频 | 成人深夜免费视频 | 成人片在线播放 | 黑人粗大视频 | 亚洲视频中文字幕在线观看 | 中文字幕在线一区二区三区 | 国产精品久久久亚洲 | 99看片网| 亚洲日韩中文字幕一区 | 中文字幕一区二区三区四区不卡 | 亚洲视频在线免费观看 | 成人精品一区二区三区 | 亚洲精选一区二区 | 国产免费黄色 | 色综合久久久久 | 久久成人精品视频 | 色888www视频在线观看 | 国产精品久久久久久久久久久久久 | 在线一级片 | 欧美视频区 | 男人的天堂在线免费视频 | 一区二区三区免费在线观看 | 欧美精品一级二级 | 九九热精品在线 | 精品日韩在线 | 日韩成人av在线 | 日韩av视屏| 欧美成人免费 | 国产综合久久久 | 国产欧美久久久久久 | 色婷婷亚洲一区二区三区 | 免费午夜视频 | 午夜在线视频 | 免费观看国产视频在线 | 91成人黄色 | 日韩精品一区二区三区av | 欧美电影免费观看高清 | 日韩国产欧美精品 | 日韩大片播放器 |