python-策略模式

來源:互聯網
上載者:User

標籤:角色   常用   end   pytho   mail   get   email   int   IV   

說明:

策略指的就是為了達到某一目的而採取的手段或者方法。為了實現軟體設計咪表,對象可能會用到多種多樣的演算法。這些演算法甚至會經常改變。如果將這些演算法都寫入程式碼到對象中,將會使得對象本身變得臃腫不堪,而且有時候支援不同的演算法也是一個效能負擔。策略模式很好的實現了在運行時根據需要透明的更改對象的演算法和將演算法與本身對象解耦,從而避免出現上述兩個問題。

因此策略模式可以定義為: 定義一系列演算法,將每一個演算法封裝起來,並讓它們可以相互替換。策略模式讓演算法可以獨立於使用它的客戶變化。每一個封裝演算法的類稱之為策略(Strategy)類,策略模式提供了一種可插入式(Pluggable)演算法的實現方案

 

策略模式的結構

策略模式包含以下3個角色: Context(環境類) Strategy(抽象策略類) ConcreteStrategy(具體策略類)

執行個體:

假設某司維護著一些客戶資料,需要在該司有新產品上市或者舉行新活動時通知客戶。現通知客戶的方式有兩種:簡訊通知、郵件通知。應如何設計該系統的客戶通知部分?為解決該問題,我們先構造客戶類,包括客戶常用的連絡方式和基本資料,同時也包括要發送的內容。

class customer:    customer_name=""    snd_way=""    info=""    phone=""    email=""    def setPhone(self,phone):        self.phone=phone    def setEmail(self,mail):        self.email=mail    def getPhone(self):        return self.phone    def getEmail(self):        return self.email    def setInfo(self,info):        self.info=info    def setName(self,name):        self.customer_name=name    def setBrdWay(self,snd_way):        self.snd_way=snd_way    def sndMsg(self):        self.snd_way.send(self.info)

#snd_way向客戶發送資訊的方式,該方式置為可設,即可根據業務來進行策略的選擇。
#發送方式構建如下:class msgSender: dst_code="" def setCode(self,code): self.dst_code=code def send(self,info): passclass emailSender(msgSender): def send(self,info): print("EMAIL_ADDRESS:%s EMAIL:%s"%(self.dst_code,info))class textSender(msgSender): def send(self,info): print("TEXT_CODE:%s EMAIL:%s"%(self.dst_code,info))
#業務情境中將發送方式作為策略if __name__=="__main__": customer_x=customer() customer_x.setName("CUSTOMER_X") customer_x.setPhone("10023456789") customer_x.setEmail("[email protected]") customer_x.setInfo("Welcome to our new party!") text_sender=textSender() text_sender.setCode(customer_x.getPhone()) customer_x.setBrdWay(text_sender) customer_x.sndMsg() mail_sender=emailSender() mail_sender.setCode(customer_x.getEmail()) customer_x.setBrdWay(mail_sender) customer_x.sndMsg()

列印結果

TEXT_CODE:10023456789 EMAIL:Welcome to our new party!
EMAIL_ADDRESS:[email protected] EMAIL:Welcome to our new party!

 

模式優點

提供了對開閉原則的完美支援,使用者可以在不修改原有系統的基礎上選擇演算法或行為,也可以靈活地增加新的演算法或行為 提供了管理相關的演算法族的辦法 提供了一種可以替換繼承關係的辦法 可以避免多重條件選擇語句 提供了一種演算法的複用機制,不同的環境類可以方便地複用策略類

模式缺點

用戶端必須知道所有的策略類,並自行決定使用哪一個策略類 將造成系統產生很多具體策略類 無法同時在用戶端使用多個策略類

模式適用環境

一個系統需要動態地在幾種演算法中選擇一種 避免使用難以維護的多重條件選擇語句 不希望用戶端知道複雜的、與演算法相關的資料結構,提高演算法的保密性與安全性

另外:

仔細比較一下橋接模式和策略模式,如果把策略模式的Context設計成抽象類別和實作類別的方式,那麼策略模式和橋接模式就可以劃等號了。從類圖看上去,橋接模式比策略模式多了對一種角色(抽象角色)的抽象。二者結構的高度同構,也只能讓我們從使用意圖上去區分兩種模式:橋接模式解決抽象角色和實現角色都可以擴充的問題;而策略模式解決演算法切換和擴充的問題。

python-策略模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.