




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
設(shè)計(jì)模式什么是設(shè)計(jì)模式Christopher
Alexander:“每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。這樣你就能一次又一次地使用該方案而不必做重復(fù)勞動(dòng)?!泵恳粋€(gè)設(shè)計(jì)模式系統(tǒng)地命名、解釋和評(píng)價(jià)了面向?qū)ο笙到y(tǒng)中一個(gè)重要的和重復(fù)出現(xiàn)的設(shè)計(jì)。GoF(Gang
of
Four)設(shè)計(jì)模式四個(gè)基本要素:模式名稱、問題、解決方案、效果2023年3月3日算法基礎(chǔ)2講在設(shè)計(jì)模式之前對(duì)象/類封裝繼承多態(tài)接口:一種特殊的類,聲明了若干方法,要求繼承該接口的類必須實(shí)現(xiàn)這些方法。作用:限制繼承接口的類的方法的名稱及調(diào)用方式;隱藏了類的內(nèi)部實(shí)現(xiàn)。接口就是一種抽象的基類(父類),限制繼承它的類必須實(shí)現(xiàn)接口中定義的某些方法2023年3月3日算法基礎(chǔ)3Python中接口的兩種寫法2023年3月3日算法基礎(chǔ)4classInterface:
defmethod(self,arg):
raiseNotImplementedErrorfromabcimportabstractmethod,ABCMeta
classInterface(metaclass=ABCMeta):
@abstractmethod
defmethod(self,arg):
pass設(shè)計(jì)模式六大原則開閉原則:一個(gè)軟件實(shí)體如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。即軟件實(shí)體應(yīng)盡量在不修改原有代碼的情況下進(jìn)行擴(kuò)展。里氏(Liskov)替換原則:所有引用基類(父類)的地方必須能透明地使用其子類的對(duì)象。依賴倒置原則:高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象。換言之,要針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。接口隔離原則:使用多個(gè)專門的接口,而不使用單一的總接口,即客戶端不應(yīng)該依賴那些它不需要的接口。迪米特法則:一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少地與其他實(shí)體發(fā)生相互作用。單一職責(zé)原則:不要存在多于一個(gè)導(dǎo)致類變更的原因。通俗的說,即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)。
2023年3月3日算法基礎(chǔ)5設(shè)計(jì)模式分類創(chuàng)建型模式:工廠方法模式抽象工廠模式創(chuàng)建者模式原型模式單例模式結(jié)構(gòu)型模式適配器模式橋模式組合模式裝飾模式外觀模式享元模式代理模式行為型模式解釋器模式責(zé)任鏈模式命令模式迭代器模式中介者模式備忘錄模式觀察者模式狀態(tài)模式策略模式訪問者模式模板方法模式2023年3月3日算法基礎(chǔ)6簡(jiǎn)單工廠模式內(nèi)容:不直接向客戶端暴露對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié),而是通過一個(gè)工廠類來負(fù)責(zé)創(chuàng)建產(chǎn)品類的實(shí)例。角色:工廠角色(Creator)抽象產(chǎn)品角色(Product)具體產(chǎn)品角色(Concrete
Product)優(yōu)點(diǎn):隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)客戶端不需要修改代碼缺點(diǎn):違反了單一職責(zé)原則,將創(chuàng)建邏輯幾種到一個(gè)工廠類里當(dāng)添加新產(chǎn)品時(shí),需要修改工廠類代碼,違反了開閉原則2023年3月3日算法基礎(chǔ)7工廠方法模式內(nèi)容:定義一個(gè)用于創(chuàng)建對(duì)象的接口(工廠接口),讓子類決定實(shí)例化哪一個(gè)產(chǎn)品類。角色:抽象工廠角色(Creator)具體工廠角色(Concrete
Creator)抽象產(chǎn)品角色(Product)具體產(chǎn)品角色(Concrete
Product)工廠方法模式相比簡(jiǎn)單工廠模式將每個(gè)具體產(chǎn)品都對(duì)應(yīng)了一個(gè)具體工廠。2023年3月3日算法基礎(chǔ)8工廠方法模式2023年3月3日算法基礎(chǔ)9工廠方法模式適用場(chǎng)景:需要生產(chǎn)多種、大量復(fù)雜對(duì)象的時(shí)候需要降低耦合度的時(shí)候當(dāng)系統(tǒng)中的產(chǎn)品種類需要經(jīng)常擴(kuò)展的時(shí)候優(yōu)點(diǎn):每個(gè)具體產(chǎn)品都對(duì)應(yīng)一個(gè)具體工廠類,不需要修改工廠類代碼隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)缺點(diǎn):每增加一個(gè)具體產(chǎn)品類,就必須增加一個(gè)相應(yīng)的具體工廠類2023年3月3日算法基礎(chǔ)10抽象工廠模式內(nèi)容:定義一個(gè)工廠類接口,讓工廠子類來創(chuàng)建一系列相關(guān)或相互依賴的對(duì)象。例:生產(chǎn)一部手機(jī),需要手機(jī)殼、CPU、操作系統(tǒng)三類對(duì)象進(jìn)行組裝,其中每類對(duì)象都有不同的種類。對(duì)每個(gè)具體工廠,分別生產(chǎn)一部手機(jī)所需要的三個(gè)對(duì)象。角色:抽象工廠角色(Creator)具體工廠角色(Concrete
Creator)抽象產(chǎn)品角色(Product)具體產(chǎn)品角色(Concrete
Product)客戶端(Client)相比工廠方法模式,抽象工廠模式中的每個(gè)具體工廠都生產(chǎn)一套產(chǎn)品。2023年3月3日算法基礎(chǔ)11抽象工廠模式2023年3月3日算法基礎(chǔ)12抽象工廠模式適用場(chǎng)景:系統(tǒng)要獨(dú)立于產(chǎn)品的創(chuàng)建與組合時(shí)強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象的設(shè)計(jì)以便進(jìn)行聯(lián)合使用時(shí)提供一個(gè)產(chǎn)品類庫(kù),想隱藏產(chǎn)品的具體實(shí)現(xiàn)時(shí)優(yōu)點(diǎn):將客戶端與類的具體實(shí)現(xiàn)相分離每個(gè)工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列有利于產(chǎn)品的一致性(即產(chǎn)品之間的約束關(guān)系)缺點(diǎn):難以支持新種類的(抽象)產(chǎn)品2023年3月3日算法基礎(chǔ)13建造者模式內(nèi)容:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。角色:抽象建造者(Builder)具體建造者(Concrete
Builder)指揮者(Director)產(chǎn)品(Product)建造者模式與抽象工廠模式相似,也用來創(chuàng)建復(fù)雜對(duì)象。主要區(qū)別是建造者模式著重一步步構(gòu)造一個(gè)復(fù)雜對(duì)象,而抽象工廠模式著重于多個(gè)系列的產(chǎn)品對(duì)象。2023年3月3日算法基礎(chǔ)14建造者模式2023年3月3日算法基礎(chǔ)15建造者模式適用場(chǎng)景:當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法(Director)應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式(Builder)時(shí)當(dāng)構(gòu)造過程允許被構(gòu)造的對(duì)象有不同的表示時(shí)(不同Builder)。優(yōu)點(diǎn):隱藏了一個(gè)產(chǎn)品的內(nèi)部結(jié)構(gòu)和裝配過程將構(gòu)造代碼與表示代碼分開可以對(duì)構(gòu)造過程進(jìn)行更精細(xì)的控制2023年3月3日算法基礎(chǔ)16單例模式內(nèi)容:保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。角色:?jiǎn)卫⊿ingleton)適用場(chǎng)景當(dāng)類只能有一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它時(shí)優(yōu)點(diǎn):對(duì)唯一實(shí)例的受控訪問單例相當(dāng)于全局變量,但防止了命名空間被污染與單例模式功能相似的概念:全局變量、靜態(tài)變量(方法)2023年3月3日算法基礎(chǔ)17創(chuàng)建型模式小結(jié)依賴于繼承的創(chuàng)建型模式:工廠方法模式依賴于組合的創(chuàng)建性模式:抽象工廠模式、創(chuàng)建者模式2023年3月3日算法基礎(chǔ)18適配器模式內(nèi)容:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。角色:目標(biāo)接口(Target)待適配的類(Adaptee)適配器(Adapter)兩種實(shí)現(xiàn)方式:類適配器:使用多繼承對(duì)象適配器:使用組合2023年3月3日算法基礎(chǔ)19適配器模式2023年3月3日算法基礎(chǔ)20適配器模式適用場(chǎng)景:想使用一個(gè)已經(jīng)存在的類,而它的接口不符合你的要求(對(duì)象適配器)想使用一些已經(jīng)存在的子類,但不可能對(duì)每一個(gè)都進(jìn)行子類化以匹配它們的接口。對(duì)象適配器可以適配它的父類接口。2023年3月3日算法基礎(chǔ)21組合模式內(nèi)容:將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。角色:抽象組件(Component)葉子組件(Leaf)復(fù)合組件(Composite)客戶端(Client)2023年3月3日算法基礎(chǔ)22組合模式2023年3月3日算法基礎(chǔ)23組合模式適用場(chǎng)景:表示對(duì)象的“部分-整體”層次結(jié)構(gòu)(特別是結(jié)構(gòu)是遞歸的)希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象優(yōu)點(diǎn):定義了包含基本對(duì)象和組合對(duì)象的類層次結(jié)構(gòu)簡(jiǎn)化客戶端代碼,即客戶端可以一致地使用組合對(duì)象和單個(gè)對(duì)象更容易增加新類型的組件缺點(diǎn):很難限制組合中的組件2023年3月3日算法基礎(chǔ)24代理模式內(nèi)容:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。角色:抽象實(shí)體(Subject)實(shí)體(RealSubject)代理(Proxy)適用場(chǎng)景:遠(yuǎn)程代理:為遠(yuǎn)程的對(duì)象提供代理虛代理:根據(jù)需要?jiǎng)?chuàng)建很大的對(duì)象保護(hù)代理:控制對(duì)原始對(duì)象的訪問,用于對(duì)象有不同訪問權(quán)限時(shí)優(yōu)點(diǎn):遠(yuǎn)程代理:可以隱藏對(duì)象位于遠(yuǎn)程地址空間的事實(shí)虛代理:可以進(jìn)行優(yōu)化,例如根據(jù)要求創(chuàng)建對(duì)象保護(hù)代理:允許在訪問一個(gè)對(duì)象時(shí)有一些附加的內(nèi)務(wù)處理2023年3月3日算法基礎(chǔ)25代理模式2023年3月3日算法基礎(chǔ)26責(zé)任鏈模式內(nèi)容:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。角色:抽象處理者(Handler)具體處理者(ConcreteHandler)客戶端(Client)例:請(qǐng)假部門批準(zhǔn):leader部門經(jīng)理總經(jīng)理Javascript事件浮升機(jī)制2023年3月3日算法基礎(chǔ)27責(zé)任鏈模式2023年3月3日算法基礎(chǔ)28責(zé)任鏈模式適用場(chǎng)景:有多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理由運(yùn)行時(shí)決定在不明確接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求優(yōu)點(diǎn):降低耦合度:一個(gè)對(duì)象無需知道是其他哪一個(gè)對(duì)象處理其請(qǐng)求缺點(diǎn):請(qǐng)求不保證被接收:鏈的末端沒有處理或鏈配置錯(cuò)誤2023年3月3日算法基礎(chǔ)29觀察者模式內(nèi)容:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),
所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。觀察者模式又稱“發(fā)布-訂閱”模式角色:抽象主題(Subject)具體主題(ConcreteSubject)——發(fā)布者抽象觀察者(Observer)具體觀察者(ConcreteObserver)——訂閱者2023年3月3日算法基礎(chǔ)30觀察者模式2023年3月3日算法基礎(chǔ)31觀察者模式適用場(chǎng)景:當(dāng)一個(gè)抽象模型有兩方面,其中一個(gè)方面依賴于另一個(gè)方面。將這兩者封裝在獨(dú)立對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象,而不知道具體有多少對(duì)象有待改變。當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰(shuí)。換言之,你不希望這些對(duì)象是緊密耦合的。優(yōu)點(diǎn):目標(biāo)和觀察者之間的抽象耦合最小支持廣播通信缺點(diǎn):多個(gè)觀察者之間互不知道對(duì)方存在,因此一個(gè)觀察者對(duì)主題的修改可能造成錯(cuò)誤的更新。2023年3月3日算法基礎(chǔ)32策略模式內(nèi)容:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化。角色:抽象策略(Strategy)具體策略(ConcreteStrategy)上下文(Context)適用場(chǎng)景:許多相關(guān)的類僅僅是行為有異需要使用一個(gè)算法的不同變體算法使用了客戶端無需知道的數(shù)據(jù)一個(gè)類中的多種行為以多個(gè)條件語(yǔ)句的形式存在,可以將這些行為封裝如不同的策略類中。2023年3月3日算法基礎(chǔ)33策略模式2023年3月3日算法基礎(chǔ)34策略模式優(yōu)點(diǎn):定義了一系列可重用的算法和行為消除了一些條件語(yǔ)句可以提供相同行為的不同實(shí)現(xiàn)缺點(diǎn):客戶必須了解不同的策略策略與上下文之間的通信開銷增加了對(duì)象的數(shù)目2023年3月3日算法基礎(chǔ)35模板方法模
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度產(chǎn)品召回風(fēng)險(xiǎn)承擔(dān)協(xié)議書
- 2025年度生物科技私下股份分配與成果轉(zhuǎn)化協(xié)議書
- 2025年度再婚家庭婚姻和解及子女撫養(yǎng)協(xié)議
- 2025年度企業(yè)年鑒圖文編纂及出版協(xié)議
- 2025年度安防系統(tǒng)智能化升級(jí)與維護(hù)合同
- 2025年度企業(yè)內(nèi)部控制體系建設(shè)咨詢合同模板
- 旅游景區(qū)民宿租賃居間合同
- 2025年度保險(xiǎn)銷售人員勞動(dòng)合同解除與賠償規(guī)范
- 2025年度三年勞動(dòng)合同漲薪與員工職業(yè)規(guī)劃輔導(dǎo)合同
- 2025年度雙方經(jīng)濟(jì)糾紛一次性解決及確認(rèn)協(xié)議
- 重慶市2024-205學(xué)年秋高二(上)期末考試歷史試卷(含答案)康德卷
- 廣西柳州市2025屆高三第二次模擬考試政治試題含答案
- 設(shè)備維修績(jī)效考核方案
- 《宏觀經(jīng)濟(jì)管理研究》課件
- 鳳凰衛(wèi)視中文臺(tái)節(jié)目表
- 2025屆廣東省佛山一中、石門中學(xué)高考數(shù)學(xué)考前最后一卷預(yù)測(cè)卷含解析
- DCMM初級(jí)認(rèn)證知識(shí)考點(diǎn)練習(xí)試題
- 2025年職業(yè)衛(wèi)生工作計(jì)劃
- 做賬實(shí)操-農(nóng)貿(mào)市場(chǎng)的賬務(wù)處理示例
- 余華《活著》解讀課件
- 關(guān)于納粹德國(guó)元首希特勒的歷史資料課件
評(píng)論
0/150
提交評(píng)論