24種設(shè)計(jì)模式的定義和使用場(chǎng)合_第1頁
24種設(shè)計(jì)模式的定義和使用場(chǎng)合_第2頁
24種設(shè)計(jì)模式的定義和使用場(chǎng)合_第3頁
24種設(shè)計(jì)模式的定義和使用場(chǎng)合_第4頁
24種設(shè)計(jì)模式的定義和使用場(chǎng)合_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

一.創(chuàng)建型模式(Creational):簡(jiǎn)單工廠模式(simpleFactory)發(fā)音:['simpl]['f&kt()ri]定義:提供一個(gè)創(chuàng)建對(duì)象實(shí)例的功能,而無須關(guān)心其具體實(shí)現(xiàn).被創(chuàng)建實(shí)例的類型可以是接口,抽象類,也可以是具體的類.抽象工廠(AbstractFactory)發(fā)音:['&bstr&kt]定義:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類.使用場(chǎng)合:如果希望一個(gè)系統(tǒng)獨(dú)立于它的產(chǎn)品的創(chuàng)建,組合和表示的時(shí)候,換句話書,希望一個(gè)系統(tǒng)只是知道產(chǎn)品的接口,而不關(guān)心實(shí)現(xiàn)的時(shí)候.如果一個(gè)系統(tǒng)要由多個(gè)產(chǎn)品系列中的一個(gè)來配置的時(shí)候.換句話說,就是可以,就是可以動(dòng)態(tài)地切換產(chǎn)品簇的時(shí)候.如果強(qiáng)調(diào)一系列相關(guān)產(chǎn)品的接口,以便聯(lián)合使用他們的時(shí)候建造者模式(Builder)發(fā)音:['bild]定義:將復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示.使用場(chǎng)合:如果創(chuàng)建對(duì)象的算法,應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)如果同一個(gè)構(gòu)建過程有著不同的表示時(shí)3?工廠方法模式(FactoryMethod)定義:為創(chuàng)建對(duì)象定義一個(gè)接口,讓子類決定實(shí)例化哪個(gè)類.工廠方法讓一個(gè)類的實(shí)例化延遲到了子類.使用場(chǎng)景:客戶類不關(guān)心使用哪個(gè)具體類,只關(guān)心該接口所提供的功能.創(chuàng)建過程比較復(fù)雜,例如需要初始化其他關(guān)聯(lián)的資源類,讀取配置文件等.接口有很多具體實(shí)現(xiàn)或者抽象類有很多具體子類時(shí),不希望給客戶程序暴露過多的此類的內(nèi)部結(jié)構(gòu),隱藏這些細(xì)節(jié)可以降低耦合度.優(yōu)化性能,比如緩存大對(duì)象或者初始化比較耗時(shí)的對(duì)象4.原型模式(PrototypeMethod)發(fā)音:['prottaip]定義:使用原形實(shí)例指定將要?jiǎng)?chuàng)建的對(duì)象類型,通過復(fù)制這個(gè)實(shí)例創(chuàng)建新的對(duì)象.應(yīng)用場(chǎng)合:如果一個(gè)系統(tǒng)想要獨(dú)立于它想要使用的對(duì)象時(shí),可以使用原型模式,讓系統(tǒng)只面向接口編程,在系統(tǒng)需要新的對(duì)象的時(shí)候,可以通過克隆原型來得到.如果需要實(shí)例化的類是在運(yùn)行時(shí)刻動(dòng)態(tài)指定時(shí),可以使用原型模式,通過克隆原型來得到需要的實(shí)例.單例模式(Singleton)發(fā)音:['szgg()lt()n]定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn).使用場(chǎng)合:當(dāng)需要控制一個(gè)類的實(shí)例只能有一個(gè),而且客戶只能從一個(gè)全局訪問點(diǎn)訪問它時(shí),可以使用單例模式,這些功能恰好是單例模式要解決的問題.二.結(jié)構(gòu)型模式(struct)發(fā)音:[strAkt]適配器模式(Adapter)發(fā)音:['d&pt]定義:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口.適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作.使用場(chǎng)合;如果先要使用一個(gè)已經(jīng)存在的類,但是它的接口不符合你的需求,這種情況可以使用適配器模式,來把已有的實(shí)現(xiàn)轉(zhuǎn)換成你需要的接口.如果你想創(chuàng)建一個(gè)可以復(fù)用的類,這個(gè)類可能和一些不兼容的類一起工作,這中情況可以使用適配器模式,到時(shí)候需要什么就適配什么.如果你想使用一些已經(jīng)竄在的子類,是不坑對(duì)每一個(gè)子類都進(jìn)行適配,這中情況可以使用適配器模式,直接適配這些子類的父類就可以了.橋接模式(Bridge)發(fā)音:[brzd3]定義:將抽象部分與它的實(shí)現(xiàn)部分分離,使他們可以獨(dú)立變化.使用場(chǎng)合:如果你不希望在抽象部分和實(shí)現(xiàn)部分采用固定的綁定關(guān)系,可以采用橋接模式.如果出現(xiàn)抽象部分和實(shí)現(xiàn)部分都能夠擴(kuò)展的情況,可以采用橋接模式,讓抽象部分和實(shí)現(xiàn)部分獨(dú)立地變化.如果希望實(shí)現(xiàn)部分的修改不會(huì)對(duì)客戶產(chǎn)生影響,可以采用橋接模式.如果采用繼承的實(shí)現(xiàn)方案,會(huì)導(dǎo)致產(chǎn)生很多子類,對(duì)于這種情況,可以考慮采用橋接模式.組合模式(Composite)發(fā)音:['knmpzit]定義:將對(duì)象組合成屬性結(jié)構(gòu)以表示”部分-整體”的層次結(jié)構(gòu),組合模式使用的用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性.使用場(chǎng)合:如果你想表示對(duì)象的部分-整體層次結(jié)構(gòu),可以使用..把整體和部分的操作統(tǒng)一起來,使得層次結(jié)構(gòu)實(shí)現(xiàn)更簡(jiǎn)單,從外部來使用,這個(gè)層次結(jié)構(gòu)也容易.如果希望同意地使用組合結(jié)構(gòu)中的所有對(duì)象,可以選用...,這正是組合模式提供的主要功能.9.裝飾器模式(DecoratorMethod)發(fā)音:['dekreit]定義:動(dòng)態(tài)的給一個(gè)對(duì)象增加一些額外的職責(zé),就增加功能來說,裝飾模式生成子類更為靈活.使用場(chǎng)合:如果需要愛不影響其他對(duì)象的情況下,以動(dòng)態(tài),透明的方式給對(duì)象添加職責(zé),可以使用裝飾模式.如果不適合使用子類來進(jìn)行擴(kuò)展的時(shí)候,可以考慮使用裝飾模式.10.外觀模式(Facade)發(fā)音:[f'sa:d]定義:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,Facade模式定義了一個(gè)高層的接口,這個(gè)接口使得這一子系統(tǒng)更加同容易使用.使用場(chǎng)景:如果希望為一個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)簡(jiǎn)單接口的時(shí)候,可以考慮使用外觀模式.使用外觀對(duì)象來實(shí)現(xiàn)大部分客戶需要的功能,從而簡(jiǎn)化客戶的使用.如果想要讓客戶程序和抽象類的實(shí)現(xiàn)部分松散耦合,可以考慮使用外觀模式,使用外觀對(duì)象來將這個(gè)子系統(tǒng)與他的客戶分離開來,從而提高子系統(tǒng)的獨(dú)立性和可移植性.如果構(gòu)建多層節(jié)后的系統(tǒng),可以考慮使用外觀模式使用外觀模式對(duì)象作為每層的入口,這樣可以簡(jiǎn)化層間調(diào)用,也可以松散出層次之間的依賴關(guān)系.11享元模式(Flyweight)發(fā)音:['flaiweit]定義:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象.使用場(chǎng)合:如果一個(gè)應(yīng)用程序使用了大量的細(xì)粒度對(duì)象,可以使用享元模式來減少對(duì)象的數(shù)量.如果猶豫使用大量的對(duì)象,造成很大的存儲(chǔ)開銷,可以使用享元模式來減少對(duì)象數(shù)量,并節(jié)約內(nèi)存.如果對(duì)象的大多數(shù)狀態(tài)都可以轉(zhuǎn)變成外部狀態(tài),比如通過計(jì)算得到,或者從外部傳入等,可以使用享元模式來實(shí)現(xiàn)內(nèi)部狀態(tài)和外部狀態(tài)的分離.如果不考慮對(duì)象的外部狀態(tài),可以用相對(duì)較少的共享對(duì)象取代很多組合對(duì)象,可以使用享元模式來共享對(duì)象.然后組合對(duì)象來使用這些共享對(duì)象.代理模式(Proxy)發(fā)音:['proksi]定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問.使用場(chǎng)合:需要為一個(gè)對(duì)象在不同的地址空間提供局部代表的時(shí)候,可以使用遠(yuǎn)程代理.需要按照需要?jiǎng)?chuàng)建開銷很大的對(duì)象的時(shí)候,可以使用虛代理.需要控制對(duì)原始對(duì)象的訪問的時(shí)候,可以使用保護(hù)代理.需要在訪問你對(duì)象執(zhí)行一些附加操作的時(shí)候,可以使用智能指引代理.三行為型模式(behavioral)發(fā)音[bi'heivjr1]職責(zé)鏈模式(ChainOfResponsibility)發(fā)音:[tfein][ri,spnnsi'bi1iti]定義:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,,從而避免請(qǐng)求的發(fā)送者和接收者之間耦合關(guān)系.將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止.使用場(chǎng)合:如果有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,但是具體由哪個(gè)對(duì)象來處理該請(qǐng)求,是運(yùn)行時(shí)刻動(dòng)態(tài)確定的.如果你想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的其中一個(gè)提交請(qǐng)求的話,可以使用職責(zé)鏈模式.如果想要?jiǎng)討B(tài)指定處理一個(gè)請(qǐng)求的對(duì)象結(jié)合,可以使用職責(zé)鏈模式.命令模式(Command)發(fā)音:[k'ma:nd]定義:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及支持可撤銷的操作.解釋器模式(Interpreter)發(fā)音:[in't3:prit]定義:給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子.使用場(chǎng)合:迭代器模式(Iterator)定義:提供一種方法順序訪問一個(gè)聚合對(duì)象中的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示.使用場(chǎng)合:如果你希望提供訪問一個(gè)聚合對(duì)象的內(nèi)容,但是又不想暴露他的內(nèi)部表示的時(shí)候,可以使用迭代器模式來提供迭代器接口,從而讓客戶端只是通過迭代器的接口來訪問聚合對(duì)象,而無須關(guān)心聚合對(duì)象的內(nèi)部實(shí)現(xiàn).如果你希望有多種遍歷方式可以訪問聚合對(duì)象,可以使用…如果你希望為遍歷不同的聚合對(duì)象提供一個(gè)統(tǒng)一的接口,可以使用.…中介模式(Mediator)發(fā)音:['mi:dieit]定義:用一個(gè)中介對(duì)象類封裝一系列對(duì)象的交互.中介者使得各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互.使用場(chǎng)合:如果一組對(duì)象之間的通信方式比較復(fù)雜,導(dǎo)致相互依賴,結(jié)構(gòu)混亂,可以采用中介模式,把這些對(duì)象相互的交互管理起來,各個(gè)對(duì)象都只需要和中介者交互,從而是的各個(gè)對(duì)象松散耦合,結(jié)構(gòu)也更清晰易懂.如果一個(gè)對(duì)象引用很多的對(duì)象,并直接跟這些對(duì)象交互,導(dǎo)致難以復(fù)用該對(duì)象,可以采用中介者模式,把這個(gè)對(duì)象跟其他對(duì)象的交互封裝到中介者對(duì)象里面,這個(gè)對(duì)象只需要和中介者對(duì)象交互就可了.備忘錄模式(Memento)發(fā)音:[mi'mentu]在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài).這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài).使用場(chǎng)合:如果必須要保存一個(gè)對(duì)象在某一個(gè)時(shí)刻的全部或者部分狀態(tài),方便以后需要的時(shí)候,可以把該對(duì)象恢復(fù)到先前的狀態(tài),可以使用備忘錄模式.如果需要保存一個(gè)對(duì)象的內(nèi)部狀態(tài),但是如果用接口來讓其他對(duì)象直接得到這些需要保存的狀態(tài),將會(huì)暴露對(duì)象的實(shí)現(xiàn)希捷并破壞對(duì)象的封裝性,這是可以使用備忘錄.觀察者模式(Observer)發(fā)音:[b'z3:v]定義:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系.當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新.使用場(chǎng)合;當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面的操作依賴于另一個(gè)方面的狀態(tài)變化,那么就可以選用觀察者模式,將這兩者封裝成觀察者和目標(biāo)對(duì)象,當(dāng)目標(biāo)對(duì)象變化的時(shí)候,依賴于它的觀察者對(duì)象也會(huì)發(fā)生相應(yīng)的變化.這樣就把抽象模型的這兩個(gè)方面分離了使得,它們可以獨(dú)立地改變和復(fù)用.如果在更改一個(gè)對(duì)象的時(shí)候,需要同時(shí)連帶改變其他對(duì)象,而且不知道究竟應(yīng)該有多少對(duì)象需要被連帶改變,這種情況可以選用觀察者模式,被改的那一個(gè)對(duì)象很明顯就相當(dāng)于是目標(biāo)對(duì)象,而需要連帶修改的對(duì)歌其他對(duì)象,就作為多個(gè)觀察著對(duì)象了.當(dāng)一個(gè)對(duì)象必須通知其他的對(duì)象,但是你又希望這個(gè)對(duì)象和其他被它通知的對(duì)象是松散耦合的,也就是說這個(gè)對(duì)象其實(shí)不詳知道具體被通知的對(duì)象.這種情況可以選用觀察者模式,這個(gè)對(duì)象就相當(dāng)于是目標(biāo)對(duì)象,而被它通知的對(duì)象就是觀察者對(duì)象了.狀態(tài)模式(State)發(fā)音:[steit]允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變是改變它的行為.對(duì)象看起來似乎修改了他的類.使用場(chǎng)合:如果一個(gè)對(duì)象的行為取決于它的狀態(tài),而且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)來改變它的行為,可以使用…來包狀態(tài)和行為分離開.雖然分離了,但是狀態(tài)和行為是有對(duì)應(yīng)關(guān)系的,可以在運(yùn)行期間,通過改變狀態(tài),就能夠調(diào)用到該狀態(tài)對(duì)應(yīng)的狀態(tài)處理對(duì)象上去從而改變對(duì)象的行為.如果一個(gè)操作中含有龐大的多分枝語句,而且這些分支依賴于該對(duì)象的狀態(tài),可以使用?…把各個(gè)分支的處理分散包裝到單獨(dú)的對(duì)象處理類中,這樣,這些分支對(duì)應(yīng)的對(duì)象就可以不依賴于其他對(duì)象而獨(dú)立變化了.策略模式(Strategy)發(fā)音:['str&tid3i]定義:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使他們可以相互替換.本模式使得算法可獨(dú)立于使用它的客戶而變化.使用場(chǎng)合;出現(xiàn)有許多相關(guān)的類,僅僅是行為有差別的情況下,可以使用策略模式來使用多個(gè)行為中的一個(gè)來配置一個(gè)類的方法,實(shí)現(xiàn)算法動(dòng)態(tài)切換出現(xiàn)同一算法,有很多不同實(shí)現(xiàn)的情況下,可以使用策略模式來把這些”不同的實(shí)現(xiàn)”實(shí)現(xiàn)成為一個(gè)算法的類層次.需要封裝算法中,有與算法相關(guān)數(shù)據(jù)的情況下,可以使用策略模式來避免暴露這些跟算法相關(guān)的數(shù)據(jù)結(jié)構(gòu).出現(xiàn)抽象一個(gè)定義了很多行為的類,并且是通過多個(gè)if-else語句來選擇這些行為的情況下,可以使用策略模式來替換這些條件語句.模版方法模式(TemplateMethod)發(fā)音:['templeit;-plit]定義:定義在一個(gè)操作中的算法框架,把一些步驟推遲到子類去實(shí)現(xiàn).模版方法模式讓子類不需要改變算法的結(jié)構(gòu)而重新定義特定的算法步驟功能:能夠解決代碼的冗余問題把某些算法步驟延遲到子類易于擴(kuò)展父類提供了算法框架,控制了算法的執(zhí)行流程,而子類不能改變算法的流程,子類的方法的調(diào)用由父類的模版方法決定.父類可以把那些重要的,不允許改變的方法屏蔽掉,不讓子類去復(fù)寫他們.需要固定定義算法骨架,實(shí)現(xiàn)一個(gè)算法的不變的部分,并把可變的行為留給子類來實(shí)現(xiàn)的情況.各個(gè)子類中具有公共行為,應(yīng)該抽取出來,集中在一個(gè)公共類中去實(shí)現(xiàn),從而避免復(fù)雜的代碼重復(fù)需要控制子類擴(kuò)展的情況.模版方法模式會(huì)在特定的點(diǎn)來調(diào)用子類的方法,這樣只允許在這些點(diǎn)進(jìn)行擴(kuò)展.知識(shí):回調(diào):表示一段可執(zhí)行邏輯的引用(或者指針),我們把該引用(或者指針)傳遞到另外一段邏輯(或者方法)里供這段邏輯適時(shí)調(diào)用(網(wǎng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論