天天看小說

第158章

小A:“模板方法模式與策略模式有什麼不同?”

大B:“模板方法模式與策略模式的作用相常類似。有時(shí)可以用策略模式替代模板方法模式。模板方法模式通過繼承來實(shí)現(xiàn)代碼複用,策略模式使用委託,委託比繼承具有更大的靈活性。繼承經(jīng)常 被錯(cuò)誤的使用。策略模式把不確定的行爲(wèi)集中到一個(gè)接口中,並在主類委託這個(gè)接口?!?

思考剛纔的訂單處理例子,改爲(wèi)策略模式後。

1、把不確定的行爲(wèi)抽取爲(wèi)一個(gè)接口。

代碼:

PublicinterfaceOrderHelper{

publicintgetOrderItemPrice(OrderItemorderItem);

publicintgetSpendingLimit(intcustomerId);

publicintsaveOrder(intcustomerId,inttotal,ListorderItemList);

}

rendercode();

2、而把這個(gè)具體類調(diào)用這個(gè)接口的相應(yīng)方法來實(shí)現(xiàn)具體的邏輯。

代碼:

publicclassOrder{

privateOrderHelperorderHelpr;

publicvoidsetOrderHelper(OrderHelperorderHelper){

this.orderHelper=orderHelper;

}

publicOrderplaceOrder(intcustomerId,ListorderItemList){

inttotal=0;

for(inti=0;iorderHelpr.getSpendingLimit(customerId)){

thrownewBusinessException(“超出信用額度”+orderHelpr.getSpendingLimit(customerId));

}

intorderId=orderHelpr.saveOrder(customerId,total,orderItemList);

returnnewOrderImpl(orderId,total);

}

}

rendercode();

大B:“這樣Order類不再是一個(gè)抽象類,而是一個(gè)具體類。Order類委託OrderHelpher接口來完成placeOrder方法所需的基本操作。像在這種情況下使用策略模式更具有優(yōu)勢,策略模式不需要繼承來實(shí)現(xiàn)。而是通過一個(gè)委託對象來實(shí)現(xiàn)。OrderHelper接口無需要去繼續(xù)任何指定的類。而相對來說,採用策略來實(shí)現(xiàn)會(huì)更復(fù)雜一些。由此可見,模板方法模式主要應(yīng)用於框架設(shè)計(jì)中,以確?;惪刂铺幚砹鞒痰倪壿嬳樞颍ㄈ缈蚣艿某跏蓟?。像上面的測試基類中。框架通常需要控制反轉(zhuǎn)。而在一些情況中,優(yōu)級先考慮使用策略模式:當(dāng)需要變化的操作非常多時(shí),採用策略模式把這些操作抽取到一個(gè)接口。當(dāng)那些基本操作的實(shí)現(xiàn)需要與其它類相關(guān)時(shí),應(yīng)該使用策略模式。通過委託接口把行爲(wèi)與實(shí)現(xiàn)完全分離出來(比如數(shù)據(jù)存?。??!”热缬唵翁幚淼膕aveOrder方法,是寫入數(shù)據(jù)庫的。它的實(shí)現(xiàn)與採用何種持久化模式相關(guān)。當(dāng)某些基本操作的實(shí)現(xiàn)可能需要在運(yùn)行時(shí)改變時(shí),可以通過在運(yùn)行時(shí)改變委託對象來實(shí)現(xiàn),而繼承則不能。所以才採用策略模式?!?

第147章第124章第30章第183章第153章第174章第228章第124章第212章第60章第128章第109章第213章第48章第217章第223章第32章第135章第93章第76章第92章第144章第52章第149章第164章第53章第120章第151章第78章第101章第126章第4章第1章第91章第151章第183章第56章第60章第195章第36章第147章第87章第87章第165章第72章第9章第142章第26章第6章第21章第184章第87章第39章第174章第151章第86章第177章第225章第186章第109章第205章第23章第164章第32章第6章第157章第73章第180章第57章第55章第21章第125章第115章第52章第110章第223章第167章第37章第30章第184章第55章第214章第24章第103章第226章第201章第127章第71章第139章第195章第71章第168章第122章第110章第204章第141章第222章第171章第187章第180章
第147章第124章第30章第183章第153章第174章第228章第124章第212章第60章第128章第109章第213章第48章第217章第223章第32章第135章第93章第76章第92章第144章第52章第149章第164章第53章第120章第151章第78章第101章第126章第4章第1章第91章第151章第183章第56章第60章第195章第36章第147章第87章第87章第165章第72章第9章第142章第26章第6章第21章第184章第87章第39章第174章第151章第86章第177章第225章第186章第109章第205章第23章第164章第32章第6章第157章第73章第180章第57章第55章第21章第125章第115章第52章第110章第223章第167章第37章第30章第184章第55章第214章第24章第103章第226章第201章第127章第71章第139章第195章第71章第168章第122章第110章第204章第141章第222章第171章第187章第180章
主站蜘蛛池模板: 滦南县| 北碚区| 肥乡县| 含山县| 德江县| 鄂尔多斯市| 论坛| 广饶县| 武胜县| 南江县| 宜宾县| 措勤县| 介休市| 松阳县| 天峻县| 西藏| 曲沃县| 宁波市| 新绛县| 芒康县| 南康市| 乌拉特中旗| 常州市| 邮箱| 彝良县| 邢台县| 什邡市| 监利县| 额尔古纳市| 延长县| 定陶县| 东丰县| 武威市| 鱼台县| 伊宁市| 通榆县| 喀喇| 夏邑县| 城口县| 江阴市| 扎赉特旗|