怎么在Java項(xiàng)目中實(shí)現(xiàn)一個(gè)策略模式?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
策略模式指:策略模式指將程序中可變部分抽象分離成一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
策略模式一般由下面三部分組成:
1. 抽象策略角色: 策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn)。
2. 具體策略角色:包裝了相關(guān)的算法和行為。
3. 環(huán)境角色:持有某一個(gè)策略類的引用,客戶端調(diào)用。
策略模式設(shè)計(jì)原則:
1. 把程序中需要變化的部分抽離出來,獨(dú)立于不變的部分
2. 面向接口編程,而不是面向?qū)崿F(xiàn)編程,多作組合 ,少用繼承。(組合 :在類中增加一個(gè)私有域,引用另外一個(gè)已經(jīng)有的類的實(shí)例,通過調(diào)用實(shí)例的方法從而獲得新的功能)
應(yīng)用舉例,以銀行為例,可能有點(diǎn)不恰當(dāng)
比如我們應(yīng)用要接入銀行支付功能。我們都知道,銀行都有支付功能,隨著技術(shù)的發(fā)展,銀行具有了開通網(wǎng)絡(luò)支付的功能。現(xiàn)在我們遇到的問題是,我們要增加支付的銀行,但是有的銀行還沒有開通網(wǎng)絡(luò)銀行,有的已經(jīng)開通了,而且也要把原有接入 的銀行添加上網(wǎng)絡(luò)銀行功能(如果已經(jīng)開通的話)。
//銀行基類,為了適應(yīng)變化,增加了網(wǎng)絡(luò)支付處理的策略處理接口BankStrategy public abstract class Bank { private BankStrategy mBankStrategy; public void setmStrategy(BankStrategy mStrategy) { this.mBankStrategy = mStrategy; } public void payMoney() { System.out.println("我具有支付功能");// 所有銀行共同的特征 } public abstract void serviceStyle();// 但每個(gè)銀行有不同的服務(wù)方法(比的就是服務(wù)),具體的子類實(shí)現(xiàn) public void netBank(){//開通網(wǎng)上銀行 mBankStrategy.netPay(); } } //———-銀行策略接口——————————— public interface BankStrategy { void netPay();// 添加網(wǎng)絡(luò)支付功能 } //————–增加開通網(wǎng)絡(luò)支付的策略實(shí)現(xiàn)類———— public class CanNetBank implements BankStrategy { @Override public void netPay() { System.out.println("我已經(jīng)開通網(wǎng)絡(luò)支付功能"); } } //————–也有不開通網(wǎng)絡(luò)支付的銀行————— public class NoNetBank implements BankStrategy { @Override public void netPay() { System.out.println("我不開通網(wǎng)絡(luò)銀行,咋的!"); } } //——-地球銀行:現(xiàn)在開通網(wǎng)絡(luò)支付—————— public class EarthBank extends Bank { public EarthBank(){ super(); super.setmStrategy(new CanNetBank());//這里就實(shí)現(xiàn)了網(wǎng)絡(luò)支付 } @Override public void serviceStyle() { System.out.println("我的服務(wù)在事個(gè)地球上是最好的!"); } } //——–太陽(yáng)銀行,說離我們太遠(yuǎn)了,不開通網(wǎng)絡(luò)銀行——————- public class SunBank extends Bank { public SunBank(){ super(); super.setmStrategy(new NoNetBank());//這里就不開通了(當(dāng)然可不調(diào)用 ,只是告訴下實(shí)現(xiàn)方法) } @Override public void serviceStyle() { System.out.println("我的服務(wù)像金子一樣發(fā)光!"); } } //———測(cè)試類———————————– public class Test { public static void main(String[] args) { System.out.println("———測(cè)試———–"); Bank duck=null; duck=new EarthBank(); duck.serviceStyle(); duck.payMoney(); duck.netBank(); System.out.println("———測(cè)試———–"); duck=new SunBank(); duck.serviceStyle(); duck.payMoney(); duck.netBank(); } }
結(jié)果打印
策略模式的優(yōu)點(diǎn):
1、 提供了管理相關(guān)的算法策略類,恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面,避免重復(fù)的代碼,使得架構(gòu)也更加靈活。
2、 提供了可以替換繼承關(guān)系的辦法(組合)。繼承也可以處理多種算法或行為,但算法或行為的環(huán)境類就可能會(huì)有一些子類,每一個(gè)子類提供一個(gè)不同的算法或行為。這樣一來算法或行為的使用者就和算法或行為本身混在一起。使得動(dòng)態(tài)改變算法變得復(fù)雜甚至不可行,也不符合開閉原則。
3、 相對(duì)于繼承代碼更好地得到復(fù)用,同時(shí)可以避免使用多重條件轉(zhuǎn)移語句。
策略模式的缺點(diǎn):
1、客戶代碼需要了解個(gè)策略實(shí)現(xiàn)的細(xì)節(jié),只適用于客戶端知道所有的算法或行為的情況。
2、 策略模式造成很多的策略類,每個(gè)具體策略類都會(huì)產(chǎn)生一個(gè)新類,增加了對(duì)象的數(shù)目。
關(guān)于怎么在Java項(xiàng)目中實(shí)現(xiàn)一個(gè)策略模式問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
分享題目:怎么在Java項(xiàng)目中實(shí)現(xiàn)一個(gè)策略模式-創(chuàng)新互聯(lián)
瀏覽路徑:http://www.rwnh.cn/article26/ppecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、云服務(wù)器、App設(shè)計(jì)、網(wǎng)站建設(shè)、定制網(wǎng)站、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容