一共23種設(shè)計(jì)模式!
廣陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
按照目的來分,設(shè)計(jì)模式可以分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。
創(chuàng)建型模式用來處理對(duì)象的創(chuàng)建過程;結(jié)構(gòu)型模式用來處理類或者對(duì)象的組合;行為型模式用來對(duì)類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述。
創(chuàng)建型模式用來處理對(duì)象的創(chuàng)建過程,主要包含以下5種設(shè)計(jì)模式:
? 工廠方法模式(Factory Method Pattern)
? 抽象工廠模式(Abstract Factory Pattern)
? 建造者模式(Builder Pattern)
? 原型模式(Prototype Pattern)
? 單例模式(Singleton Pattern)
結(jié)構(gòu)型模式用來處理類或者對(duì)象的組合,主要包含以下7種設(shè)計(jì)模式:
? 適配器模式(Adapter Pattern)
? 橋接模式(Bridge Pattern)
? 組合模式(Composite Pattern)
? 裝飾者模式(Decorator Pattern)
? 外觀模式(Facade Pattern)
? 享元模式(Flyweight Pattern)
? 代理模式(Proxy Pattern)
行為型模式用來對(duì)類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述,主要包含以下11種設(shè)計(jì)模式:
? 責(zé)任鏈模式(Chain of Responsibility Pattern)
? 命令模式(Command Pattern)
? 解釋器模式(Interpreter Pattern)
? 迭代器模式(Iterator Pattern)
? 中介者模式(Mediator Pattern)
? 備忘錄模式(Memento Pattern)
? 觀察者模式(Observer Pattern)
? 狀態(tài)模式(State Pattern)
? 策略模式(Strategy Pattern)
? 模板方法模式(Template Method Pattern)
? 訪問者模式(Visitor Pattern)
推薦你一本好書:《軟件秘笈:設(shè)計(jì)模式那點(diǎn)事》,里面講解的23中設(shè)計(jì)模式例子很生動(dòng),容易理解,還有JDK中設(shè)計(jì)模式應(yīng)用情況,看了收獲挺大的!百度里面搜“設(shè)計(jì)模式”,第一條中設(shè)計(jì)模式百度百科中就有首推該圖書,瀏覽量在20幾萬以上的,不會(huì)錯(cuò)的。好東西大家一起分享!
祝你早日學(xué)會(huì)設(shè)計(jì)模式!
我是一個(gè)java初學(xué)者,我下面寫的東西都是我個(gè)人的猜想,樓主可以作為參考,但不要相信。--------感覺由context包裝以后的耦合性更低一些,傳入不同的new AddStrategy(),context.calculate(10, 5)會(huì)實(shí)現(xiàn)不同的功能,通過這樣的方式,如果通過配置文件的方式來實(shí)現(xiàn)對(duì)算法的配置,直接利用接口就把代碼寫死了,而策略模式由于具有低耦合性就可以通過配置對(duì)象來配置不同的算法。。
策略模式通過封裝一組相關(guān)算法,為Client提供運(yùn)行時(shí)的靈活性。Client可以在運(yùn)行時(shí),選擇任一算法,而不改變使用算法的Context。一些流行的策略模式的例子是寫那些使用算法的代碼,例如加密算法、壓縮算法、排序算法。另一方面,狀態(tài)模式允許對(duì)象,在不同的狀態(tài)擁有不同的行為。因?yàn)楝F(xiàn)實(shí)世界中的對(duì)象通常都是有狀態(tài)的,所以在不同狀態(tài),行為也不一樣。例如,VM(自動(dòng)售貨機(jī))只在hasCoin狀態(tài)才給吐商品;不投幣,是不會(huì)吐的。現(xiàn)在可以清楚的看出不同之處了:意圖是不同的。狀態(tài)模式幫助對(duì)象管理狀態(tài),而策略模式允許Client選擇不同的行為。
另一個(gè)不那么容易能看出來的區(qū)別是:是誰促使了行為的改變。策略模式中,是Client提供了不同的策略給Context;狀態(tài)模式中,狀態(tài)轉(zhuǎn)移由Context或State管理。另外,如果在State中管理狀態(tài)轉(zhuǎn)移,那么必須持有Context的引用。例如,在VM的例子中,State對(duì)象需要調(diào)用VM的setState()方法去改變的狀態(tài)。另一方面,Strategy從不持有Context的引用,是Client把所選擇的Strategy傳遞給Context。由于狀態(tài)模式和策略模式的區(qū)別,是流行的Java設(shè)計(jì)原則類面試題之一,將會(huì)在本文探討在Java中,狀態(tài)模式和策略模式的異同,這可以加深理解。
(1)相似之處
看看狀態(tài)模式和策略模式的UML圖,就會(huì)發(fā)現(xiàn)結(jié)構(gòu)非常相似。使用State對(duì)象改變自己行為的對(duì)象被稱為Context對(duì)象;相似的,使用Strategy對(duì)象改變自己行為的對(duì)象叫Context對(duì)象。記住,Client和Context打交道。在狀態(tài)模式中,Context把方法調(diào)用委托給當(dāng)前的狀態(tài)對(duì)象,而在策略模式中,Context使用的Strategy對(duì)象,是被當(dāng)做參數(shù)傳遞過來的,或在Context對(duì)象被創(chuàng)建時(shí)就被提供的。
這是專為經(jīng)典的VM問題而設(shè)計(jì)的狀態(tài)模式UML類圖??梢钥闯觯琕M的狀態(tài)是個(gè)接口,表示不同狀態(tài)的具體實(shí)現(xiàn)。每一個(gè)狀態(tài)都持有Context的引用,用來管理由Context觸發(fā)的行為導(dǎo)致的狀態(tài)轉(zhuǎn)移。
這是專為實(shí)現(xiàn)排序功能而設(shè)計(jì)的策略模式UML類圖。因?yàn)榇嬖诤芏嗯判蛩惴?,該模式讓Client在排序時(shí)選擇適當(dāng)?shù)乃惴āJ聦?shí)上,Java的集合框架就使用這個(gè)模式,實(shí)現(xiàn)了用來排序的Collections.sort()方法。不同的是,不允許Client選擇排序算法,而是讓傳遞Comparator或Comparable接口的實(shí)例來指定比較策略。
(2)不同之處
策略模式封裝了一組相關(guān)算法,允許Client在運(yùn)行時(shí)使用可互換的行為;狀態(tài)模式幫助一個(gè)類在不同的狀態(tài)顯示不同的行為。
狀態(tài)模式封裝了對(duì)象的狀態(tài),而策略模式封裝算法或策略。因?yàn)闋顟B(tài)是跟對(duì)象密切相關(guān)的,不能被重用;而通過從Context中分離出策略或算法,可以重用。
在狀態(tài)模式中,每個(gè)狀態(tài)通過持有Context的引用,來實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移;但是每個(gè)策略都不持有Context的引用,只是被Context使用。
策略實(shí)現(xiàn)可以作為參數(shù)傳遞給使用的對(duì)象,例如Collections.sort(),參數(shù)包含一個(gè)Comparator策略。另一方面,狀態(tài)是Context對(duì)象自己的一部分,隨著時(shí)間的推移,Context對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài)。
雖然都符合OCP原則,策略模式也符合SRP原則(單一職責(zé)原則),因?yàn)槊總€(gè)策略都封裝自己的算法,且不依賴其他策略。一個(gè)策略的改變,并不會(huì)導(dǎo)致其他策略的變化。
另一個(gè)理論上的不同:策略模式定義了對(duì)象“怎么做”的部分。例如,排序?qū)ο笤趺磳?duì)數(shù)據(jù)排序。狀態(tài)模式定義了對(duì)象“是什么”和“什么時(shí)候做”的部分。例如,對(duì)象處于什么狀態(tài),什么時(shí)候處在某個(gè)特定的狀態(tài)。
狀態(tài)模式中很好的定義了狀態(tài)轉(zhuǎn)移的次序;而策略模式并無此需要:Client可以自由的選擇任何策略。
一些常見的策略模式的例子是封裝算法,例如排序算法,加密算法或者壓縮算法。如果看到代碼需要使用不同類型的相關(guān)算法,那么考慮使用策略模式吧。而識(shí)別何時(shí)使用狀態(tài)模式是很簡單的:如果需要管理狀態(tài)和狀態(tài)轉(zhuǎn)移,但不想使用大量嵌套的條件語句,那么就是了。
最后但最重要的一個(gè)不同之處是,策略的改變由Client完成;而狀態(tài)的改變,由Context或狀態(tài)自己。
設(shè)計(jì)模式主要分三個(gè)類型:創(chuàng)建型、結(jié)構(gòu)型和行為型。
其中創(chuàng)建型有:
一、Singleton,單例模式:保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)
二、Abstract Factory,抽象工廠:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無須指定它們的具體類。
三、Factory Method,工廠方法:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類,F(xiàn)actory Method使一個(gè)類的實(shí)例化延遲到了子類。
四、Builder,建造模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與他的表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
五、Prototype,原型模式:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型來創(chuàng)建新的對(duì)象。
行為型有:
六、Iterator,迭代器模式:提供一個(gè)方法順序訪問一個(gè)聚合對(duì)象的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示。
七、Observer,觀察者模式:定義對(duì)象間一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知自動(dòng)更新。
八、Template Method,模板方法:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可以重定義該算法得某些特定步驟。
九、Command,命令模式:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可以用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)和記錄請(qǐng)求日志,以及支持可撤銷的操作。
十、State,狀態(tài)模式:允許對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變他的行為。對(duì)象看起來似乎改變了他的類。
十一、Strategy,策略模式:定義一系列的算法,把他們一個(gè)個(gè)封裝起來,并使他們可以互相替換,本模式使得算法可以獨(dú)立于使用它們的客戶。
十二、China of Responsibility,職責(zé)鏈模式:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的送發(fā)者和接收者之間的耦合關(guān)系
十三、Mediator,中介者模式:用一個(gè)中介對(duì)象封裝一些列的對(duì)象交互。
十四、Visitor,訪問者模式:表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個(gè)元素的新操作。
十五、Interpreter,解釋器模式:給定一個(gè)語言,定義他的文法的一個(gè)表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。
十六、Memento,備忘錄模式:在不破壞對(duì)象的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。
結(jié)構(gòu)型有:
十七、Composite,組合模式:將對(duì)象組合成樹形結(jié)構(gòu)以表示部分整體的關(guān)系,Composite使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。
十八、Facade,外觀模式:為子系統(tǒng)中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個(gè)接口使得子系統(tǒng)更容易使用。
十九、Proxy,代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問
二十、Adapter,適配器模式:將一類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。
二十一、Decrator,裝飾模式:動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的職責(zé),就增加的功能來說,Decorator模式相比生成子類更加靈活。
二十二、Bridge,橋模式:將抽象部分與它的實(shí)現(xiàn)部分相分離,使他們可以獨(dú)立的變化。
二十三、Flyweight,享元模式
23種設(shè)計(jì)模式要在這里詳細(xì)的都說一遍內(nèi)容實(shí)在太多了啊,推薦你一本好書《軟件秘笈:設(shè)計(jì)模式那點(diǎn)事》,里面講解的23中設(shè)計(jì)模式例子很生動(dòng),容易理解,還有JDK中設(shè)計(jì)模式應(yīng)用情況,看了收獲挺大的!百度里面搜“設(shè)計(jì)模式”,第一條中設(shè)計(jì)模式百度百科中就有首推該圖書,瀏覽量在20幾萬以上的,不會(huì)錯(cuò)的。
祝你早日學(xué)會(huì)設(shè)計(jì)模式!
工廠模式是創(chuàng)建型模式
策略模式是行為性模式
一個(gè)關(guān)注對(duì)象創(chuàng)建
一個(gè)關(guān)注行為的封裝
策略模式就是定義一系列的算法,這些算法可以在需要的時(shí)候替換和擴(kuò)展.工廠模式是生成型的模式,在你需要的時(shí)候構(gòu)建具體的實(shí)例.
在下面的情況下應(yīng)當(dāng)考慮使用策略模式:
1. 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
2.
一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。那么這些算法可以包裝到一個(gè)個(gè)的具體算法類里面,而這些具體算法類都是一個(gè)抽象算法類的子類。換言之,這些具體
算法類均有統(tǒng)一的接口,由于多態(tài)性原則,客戶端可以選擇使用任何一個(gè)具體算法類,并只持有一個(gè)數(shù)據(jù)類型是抽象算法類的對(duì)象。
3. 一個(gè)系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復(fù)雜的和只與算法有關(guān)的數(shù)據(jù)。
4. 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。此時(shí),使用策略模式,把這些行為轉(zhuǎn)移到相應(yīng)的具體策略類里面,就可以避免使用難以維護(hù)的多重條件選擇語句,并體現(xiàn)面向?qū)ο笤O(shè)計(jì)的概念。
策略模式的優(yōu)點(diǎn)和缺點(diǎn)
策略模式有很多優(yōu)點(diǎn)和缺點(diǎn)。它的優(yōu)點(diǎn)有:
1. 策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免重復(fù)的代碼。
2.
策略模式提供了可以替換繼承關(guān)系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會(huì)有一些子類,每一個(gè)子類提
供一個(gè)不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯
混合在一起,從而不可能再獨(dú)立演化。繼承使得動(dòng)態(tài)改變算法或行為變得不可能。
3. 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。多重轉(zhuǎn)移語句不易維護(hù),它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個(gè)多重轉(zhuǎn)移語句里面,比使用繼承的辦法還要原始和落后。
策略模式的缺點(diǎn)有:
1. 客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時(shí)選擇恰當(dāng)?shù)乃惴?。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
2. 策略模式造成很多的策略類。有時(shí)候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計(jì)成可共享的,這樣策略類實(shí)例可以被不同客戶端使用。換言之,可以使用享元模式來減少對(duì)象的數(shù)量。
策略模式與很多其它的模式都有著廣泛的聯(lián)系。Strategy很容易和Bridge模式相混淆。雖然它們結(jié)構(gòu)很相似,但它們卻是為解決不同的問題
而設(shè)計(jì)的。Strategy模式注重于算法的封裝,而Bridge模式注重于分離抽象和實(shí)現(xiàn),為一個(gè)抽象體系提供不同的實(shí)現(xiàn)。Bridge模式與
Strategy模式都很好的體現(xiàn)了"Favor composite over inheritance"的觀點(diǎn)。
網(wǎng)站欄目:java策略模式實(shí)例代碼,策略模式應(yīng)用實(shí)例
網(wǎng)站鏈接:http://chinadenli.net/article8/hddcip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、外貿(mào)建站、云服務(wù)器、軟件開發(fā)、微信公眾號(hào)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)