真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java策略模式實例代碼,策略模式應(yīng)用實例

java中幾種常見的設(shè)計模式

一共23種設(shè)計模式!

廣陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

按照目的來分,設(shè)計模式可以分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。

創(chuàng)建型模式用來處理對象的創(chuàng)建過程;結(jié)構(gòu)型模式用來處理類或者對象的組合;行為型模式用來對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述。

創(chuàng)建型模式用來處理對象的創(chuàng)建過程,主要包含以下5種設(shè)計模式:

? 工廠方法模式(Factory Method Pattern)

? 抽象工廠模式(Abstract Factory Pattern)

? 建造者模式(Builder Pattern)

? 原型模式(Prototype Pattern)

? 單例模式(Singleton Pattern)

結(jié)構(gòu)型模式用來處理類或者對象的組合,主要包含以下7種設(shè)計模式:

? 適配器模式(Adapter Pattern)

? 橋接模式(Bridge Pattern)

? 組合模式(Composite Pattern)

? 裝飾者模式(Decorator Pattern)

? 外觀模式(Facade Pattern)

? 享元模式(Flyweight Pattern)

? 代理模式(Proxy Pattern)

行為型模式用來對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述,主要包含以下11種設(shè)計模式:

? 責(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è)計模式那點事》,里面講解的23中設(shè)計模式例子很生動,容易理解,還有JDK中設(shè)計模式應(yīng)用情況,看了收獲挺大的!百度里面搜“設(shè)計模式”,第一條中設(shè)計模式百度百科中就有首推該圖書,瀏覽量在20幾萬以上的,不會錯的。好東西大家一起分享!

祝你早日學(xué)會設(shè)計模式!

java策略模式與接口直接實現(xiàn)

我是一個java初學(xué)者,我下面寫的東西都是我個人的猜想,樓主可以作為參考,但不要相信。--------感覺由context包裝以后的耦合性更低一些,傳入不同的new AddStrategy(),context.calculate(10, 5)會實現(xiàn)不同的功能,通過這樣的方式,如果通過配置文件的方式來實現(xiàn)對算法的配置,直接利用接口就把代碼寫死了,而策略模式由于具有低耦合性就可以通過配置對象來配置不同的算法。。

Java中,狀態(tài)模式和策略模式的區(qū)別

策略模式通過封裝一組相關(guān)算法,為Client提供運行時的靈活性。Client可以在運行時,選擇任一算法,而不改變使用算法的Context。一些流行的策略模式的例子是寫那些使用算法的代碼,例如加密算法、壓縮算法、排序算法。另一方面,狀態(tài)模式允許對象,在不同的狀態(tài)擁有不同的行為。因為現(xiàn)實世界中的對象通常都是有狀態(tài)的,所以在不同狀態(tài),行為也不一樣。例如,VM(自動售貨機)只在hasCoin狀態(tài)才給吐商品;不投幣,是不會吐的?,F(xiàn)在可以清楚的看出不同之處了:意圖是不同的。狀態(tài)模式幫助對象管理狀態(tài),而策略模式允許Client選擇不同的行為。

另一個不那么容易能看出來的區(qū)別是:是誰促使了行為的改變。策略模式中,是Client提供了不同的策略給Context;狀態(tài)模式中,狀態(tài)轉(zhuǎn)移由Context或State管理。另外,如果在State中管理狀態(tài)轉(zhuǎn)移,那么必須持有Context的引用。例如,在VM的例子中,State對象需要調(diào)用VM的setState()方法去改變的狀態(tài)。另一方面,Strategy從不持有Context的引用,是Client把所選擇的Strategy傳遞給Context。由于狀態(tài)模式和策略模式的區(qū)別,是流行的Java設(shè)計原則類面試題之一,將會在本文探討在Java中,狀態(tài)模式和策略模式的異同,這可以加深理解。

(1)相似之處

看看狀態(tài)模式和策略模式的UML圖,就會發(fā)現(xiàn)結(jié)構(gòu)非常相似。使用State對象改變自己行為的對象被稱為Context對象;相似的,使用Strategy對象改變自己行為的對象叫Context對象。記住,Client和Context打交道。在狀態(tài)模式中,Context把方法調(diào)用委托給當(dāng)前的狀態(tài)對象,而在策略模式中,Context使用的Strategy對象,是被當(dāng)做參數(shù)傳遞過來的,或在Context對象被創(chuàng)建時就被提供的。

這是專為經(jīng)典的VM問題而設(shè)計的狀態(tài)模式UML類圖。可以看出,VM的狀態(tài)是個接口,表示不同狀態(tài)的具體實現(xiàn)。每一個狀態(tài)都持有Context的引用,用來管理由Context觸發(fā)的行為導(dǎo)致的狀態(tài)轉(zhuǎn)移。

這是專為實現(xiàn)排序功能而設(shè)計的策略模式UML類圖。因為存在很多排序算法,該模式讓Client在排序時選擇適當(dāng)?shù)乃惴?。事實上,Java的集合框架就使用這個模式,實現(xiàn)了用來排序的Collections.sort()方法。不同的是,不允許Client選擇排序算法,而是讓傳遞Comparator或Comparable接口的實例來指定比較策略。

(2)不同之處

策略模式封裝了一組相關(guān)算法,允許Client在運行時使用可互換的行為;狀態(tài)模式幫助一個類在不同的狀態(tài)顯示不同的行為。

狀態(tài)模式封裝了對象的狀態(tài),而策略模式封裝算法或策略。因為狀態(tài)是跟對象密切相關(guān)的,不能被重用;而通過從Context中分離出策略或算法,可以重用。

在狀態(tài)模式中,每個狀態(tài)通過持有Context的引用,來實現(xiàn)狀態(tài)轉(zhuǎn)移;但是每個策略都不持有Context的引用,只是被Context使用。

策略實現(xiàn)可以作為參數(shù)傳遞給使用的對象,例如Collections.sort(),參數(shù)包含一個Comparator策略。另一方面,狀態(tài)是Context對象自己的一部分,隨著時間的推移,Context對象從一個狀態(tài)轉(zhuǎn)移到另一個狀態(tài)。

雖然都符合OCP原則,策略模式也符合SRP原則(單一職責(zé)原則),因為每個策略都封裝自己的算法,且不依賴其他策略。一個策略的改變,并不會導(dǎo)致其他策略的變化。

另一個理論上的不同:策略模式定義了對象“怎么做”的部分。例如,排序?qū)ο笤趺磳?shù)據(jù)排序。狀態(tài)模式定義了對象“是什么”和“什么時候做”的部分。例如,對象處于什么狀態(tài),什么時候處在某個特定的狀態(tài)。

狀態(tài)模式中很好的定義了狀態(tài)轉(zhuǎn)移的次序;而策略模式并無此需要:Client可以自由的選擇任何策略。

一些常見的策略模式的例子是封裝算法,例如排序算法,加密算法或者壓縮算法。如果看到代碼需要使用不同類型的相關(guān)算法,那么考慮使用策略模式吧。而識別何時使用狀態(tài)模式是很簡單的:如果需要管理狀態(tài)和狀態(tài)轉(zhuǎn)移,但不想使用大量嵌套的條件語句,那么就是了。

最后但最重要的一個不同之處是,策略的改變由Client完成;而狀態(tài)的改變,由Context或狀態(tài)自己。

JAVA23種設(shè)計模式

設(shè)計模式主要分三個類型:創(chuàng)建型、結(jié)構(gòu)型和行為型。

其中創(chuàng)建型有:

一、Singleton,單例模式:保證一個類只有一個實例,并提供一個訪問它的全局訪問點

二、Abstract Factory,抽象工廠:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們的具體類。

三、Factory Method,工廠方法:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,F(xiàn)actory Method使一個類的實例化延遲到了子類。

四、Builder,建造模式:將一個復(fù)雜對象的構(gòu)建與他的表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

五、Prototype,原型模式:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型來創(chuàng)建新的對象。

行為型有:

六、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不需要暴露該對象的內(nèi)部表示。

七、Observer,觀察者模式:定義對象間一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知自動更新。

八、Template Method,模板方法:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個算法的結(jié)構(gòu)即可以重定義該算法得某些特定步驟。

九、Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進(jìn)行參數(shù)化,對請求排隊和記錄請求日志,以及支持可撤銷的操作。

十、State,狀態(tài)模式:允許對象在其內(nèi)部狀態(tài)改變時改變他的行為。對象看起來似乎改變了他的類。

十一、Strategy,策略模式:定義一系列的算法,把他們一個個封裝起來,并使他們可以互相替換,本模式使得算法可以獨立于使用它們的客戶。

十二、China of Responsibility,職責(zé)鏈模式:使多個對象都有機會處理請求,從而避免請求的送發(fā)者和接收者之間的耦合關(guān)系

十三、Mediator,中介者模式:用一個中介對象封裝一些列的對象交互。

十四、Visitor,訪問者模式:表示一個作用于某對象結(jié)構(gòu)中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用于這個元素的新操作。

十五、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

十六、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。

結(jié)構(gòu)型有:

十七、Composite,組合模式:將對象組合成樹形結(jié)構(gòu)以表示部分整體的關(guān)系,Composite使得用戶對單個對象和組合對象的使用具有一致性。

十八、Facade,外觀模式:為子系統(tǒng)中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統(tǒng)更容易使用。

十九、Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問

二十、Adapter,適配器模式:將一類的接口轉(zhuǎn)換成客戶希望的另外一個接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些類可以一起工作。

二十一、Decrator,裝飾模式:動態(tài)地給一個對象增加一些額外的職責(zé),就增加的功能來說,Decorator模式相比生成子類更加靈活。

二十二、Bridge,橋模式:將抽象部分與它的實現(xiàn)部分相分離,使他們可以獨立的變化。

二十三、Flyweight,享元模式

23種設(shè)計模式要在這里詳細(xì)的都說一遍內(nèi)容實在太多了啊,推薦你一本好書《軟件秘笈:設(shè)計模式那點事》,里面講解的23中設(shè)計模式例子很生動,容易理解,還有JDK中設(shè)計模式應(yīng)用情況,看了收獲挺大的!百度里面搜“設(shè)計模式”,第一條中設(shè)計模式百度百科中就有首推該圖書,瀏覽量在20幾萬以上的,不會錯的。

祝你早日學(xué)會設(shè)計模式!

java策略模式和工廠模式的區(qū)別

工廠模式是創(chuàng)建型模式

策略模式是行為性模式

一個關(guān)注對象創(chuàng)建

一個關(guān)注行為的封裝

策略模式就是定義一系列的算法,這些算法可以在需要的時候替換和擴展.工廠模式是生成型的模式,在你需要的時候構(gòu)建具體的實例.

在下面的情況下應(yīng)當(dāng)考慮使用策略模式:

1. 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。

2.

一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。那么這些算法可以包裝到一個個的具體算法類里面,而這些具體算法類都是一個抽象算法類的子類。換言之,這些具體

算法類均有統(tǒng)一的接口,由于多態(tài)性原則,客戶端可以選擇使用任何一個具體算法類,并只持有一個數(shù)據(jù)類型是抽象算法類的對象。

3. 一個系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復(fù)雜的和只與算法有關(guān)的數(shù)據(jù)。

4. 如果一個對象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)。此時,使用策略模式,把這些行為轉(zhuǎn)移到相應(yīng)的具體策略類里面,就可以避免使用難以維護(hù)的多重條件選擇語句,并體現(xiàn)面向?qū)ο笤O(shè)計的概念。

策略模式的優(yōu)點和缺點

策略模式有很多優(yōu)點和缺點。它的優(yōu)點有:

1. 策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級結(jié)構(gòu)定義了一個算法或行為族。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免重復(fù)的代碼。

2.

策略模式提供了可以替換繼承關(guān)系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會有一些子類,每一個子類提

供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯

混合在一起,從而不可能再獨立演化。繼承使得動態(tài)改變算法或行為變得不可能。

3. 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。多重轉(zhuǎn)移語句不易維護(hù),它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個多重轉(zhuǎn)移語句里面,比使用繼承的辦法還要原始和落后。

策略模式的缺點有:

1. 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當(dāng)?shù)乃惴悺Q言之,策略模式只適用于客戶端知道所有的算法或行為的情況。

2. 策略模式造成很多的策略類。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數(shù)量。

策略模式與很多其它的模式都有著廣泛的聯(lián)系。Strategy很容易和Bridge模式相混淆。雖然它們結(jié)構(gòu)很相似,但它們卻是為解決不同的問題

而設(shè)計的。Strategy模式注重于算法的封裝,而Bridge模式注重于分離抽象和實現(xiàn),為一個抽象體系提供不同的實現(xiàn)。Bridge模式與

Strategy模式都很好的體現(xiàn)了"Favor composite over inheritance"的觀點。


分享文章:java策略模式實例代碼,策略模式應(yīng)用實例
URL鏈接:http://weahome.cn/article/hddcip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部