時(shí)間:2017年08月30日星期三
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)源碼:https://github.com/zccodere/s...
學(xué)習(xí)源碼:https://github.com/zccodere/s...
課程大綱
什么是責(zé)任鏈模式 如何實(shí)現(xiàn)責(zé)任鏈模式 責(zé)任鏈模式如何解耦 責(zé)任鏈模式的應(yīng)用
案例:售樓案例
責(zé)任鏈模式定義
將介紹者對(duì)象連成一條鏈,并在該鏈上傳遞請(qǐng)求,直到有一個(gè)接收者對(duì)象處理它。通過讓更多對(duì)象有機(jī)會(huì)處理請(qǐng)求,避免了請(qǐng)求發(fā)送者和接收到之間的耦合。
責(zé)任鏈模式類圖
第二章:責(zé)任鏈模式實(shí)現(xiàn) 2-1 簡(jiǎn)單實(shí)現(xiàn)不同的角色擁有不同的折扣權(quán)限
代碼編寫
1.編寫PriceHandler類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 價(jià)格處理人,負(fù)責(zé)處理客戶折扣申請(qǐng) * @author zc * @version 1.0 2017-08-30 */ public abstract class PriceHandler { protected PriceHandler successor; public void setSuccessor(PriceHandler successor) { this.successor = successor; } /** * 處理折扣申請(qǐng) */ public abstract void processDiscount(float discount); /** * 創(chuàng)建PriceHandler的工廠方法 */ public static PriceHandler createPriceHandler() { // 創(chuàng)建對(duì)象 PriceHandler sales = new Sales(); PriceHandler man = new Manager(); PriceHandler dir = new Director(); PriceHandler vp = new VicePresident(); PriceHandler ceo = new CEO(); // 指定直接后繼 sales.setSuccessor(man); man.setSuccessor(dir); dir.setSuccessor(vp); vp.setSuccessor(ceo); // 返回銷售人員 return sales; } }
2.編寫Sales類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 銷售,可以批準(zhǔn)5%以內(nèi)的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Sales extends PriceHandler{ @Override public void processDiscount(float discount) { if(discount <= 0.05){ System.out.format("%s批準(zhǔn)了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
3.編寫Manager類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 銷售經(jīng)理, 可以批準(zhǔn)30%以內(nèi)的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Manager extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.3){ System.out.format("%s批準(zhǔn)了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
4.編寫Director類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 銷售總監(jiān), 可以批準(zhǔn)40%以內(nèi)的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Director extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.4){ System.out.format("%s批準(zhǔn)了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
5.編寫VicePresident類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 銷售副總裁, 可以批準(zhǔn)50%以內(nèi)的折扣 * @author zc * @version 1.0 2017-08-30 */ public class VicePresident extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.5){ System.out.format("%s批準(zhǔn)了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
6.編寫CEO類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe CEO, 可以批準(zhǔn)55%以內(nèi)的折扣。折扣超出55%, 就拒絕申請(qǐng) * @author zc * @version 1.0 2017-08-30 */ public class CEO extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.55){ System.out.format("%s批準(zhǔn)了折扣:%.2f%n",this.getClass().getName(),discount); }else{ System.out.format("%s拒絕了折扣:%.2f%n", this.getClass().getName(),discount); } } }2-2 客戶請(qǐng)求
代碼編寫
1.編寫Customer類
package com.myimooc.designpattern.c6chainofresponsibility; import java.util.Random; import com.myimooc.designpattern.c6chainofresponsibility.handler.PriceHandler; /** * @title 責(zé)任鏈模式 * @describe 客戶,請(qǐng)求折扣 * @author zc * @version 1.0 2017-08-30 */ public class Customer { private PriceHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler) { this.priceHandler = priceHandler; } public void requestDiscount(float discount){ priceHandler.processDiscount(discount); } public static void main(String[] args){ Customer customer = new Customer(); customer.setPriceHandler(PriceHandler.createPriceHandler()); Random rand = new Random(); for(int i=1;i<=100;i++){ System.out.print(i+":"); customer.requestDiscount(rand.nextFloat()); } } }2-3 重構(gòu)優(yōu)化
代碼編寫
1.編寫Lead類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 銷售小組長(zhǎng), 可以批準(zhǔn)15%以內(nèi)的折扣 * @author zc * @version 1.0 2017-08-30 */ public class Lead extends PriceHandler { @Override public void processDiscount(float discount) { if(discount<=0.15){ System.out.format("%s批準(zhǔn)了折扣:%.2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } }
2.編寫PriceHandlerFactory類
package com.myimooc.designpattern.c6chainofresponsibility.handler; /** * @title 責(zé)任鏈模式 * @describe 創(chuàng)建PriceHandler的工廠類 * @author zc * @version 1.0 2017-08-30 */ public class PriceHandlerFactory { /** * 創(chuàng)建PriceHandler的工廠方法,簡(jiǎn)單工廠方法或靜態(tài)工廠方法 */ public static PriceHandler createPriceHandler() { PriceHandler sales = new Sales(); PriceHandler lead = new Lead(); PriceHandler man = new Manager(); PriceHandler dir = new Director(); PriceHandler vp = new VicePresident(); PriceHandler ceo = new CEO(); sales.setSuccessor(lead); lead.setSuccessor(man); man.setSuccessor(dir); dir.setSuccessor(vp); vp.setSuccessor(ceo); return sales; } }
3.修改Customer類
package com.myimooc.designpattern.c6chainofresponsibility; import java.util.Random; import com.myimooc.designpattern.c6chainofresponsibility.handler.PriceHandler; import com.myimooc.designpattern.c6chainofresponsibility.handler.PriceHandlerFactory; /** * @title 責(zé)任鏈模式 * @describe 客戶,請(qǐng)求折扣 * @author zc * @version 1.0 2017-08-30 */ public class Customer { private PriceHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler) { this.priceHandler = priceHandler; } public void requestDiscount(float discount){ priceHandler.processDiscount(discount); } public static void main(String[] args){ Customer customer = new Customer(); customer.setPriceHandler(PriceHandlerFactory.createPriceHandler()); Random rand = new Random(); for(int i=1;i<=100;i++){ System.out.print(i+":"); customer.requestDiscount(rand.nextFloat()); } } }第三章:責(zé)任鏈模式剖析 3-1 深入剖析
利于解耦
發(fā)出請(qǐng)求的客戶端并不知道鏈上的哪一個(gè)接收者會(huì)處理這個(gè)請(qǐng)求,從而實(shí)現(xiàn)了客戶端和接收者之間的解耦
責(zé)任鏈模式缺點(diǎn)
1.時(shí)間:在單個(gè)hander對(duì)象的時(shí)間很短,但是在遍歷整條鏈時(shí)會(huì)花費(fèi)較長(zhǎng)的時(shí)間 2.內(nèi)存:在創(chuàng)建整條鏈時(shí),會(huì)創(chuàng)建很多類,導(dǎo)致內(nèi)存增加第四章:責(zé)任鏈模式應(yīng)用 4-1 應(yīng)用案例
Java的異常機(jī)制:Exception Handling
異常是請(qǐng)求,調(diào)用棧中的每一級(jí)是一個(gè)handler, 這些棧中的handler共同構(gòu)建成一個(gè)責(zé)任鏈, 棧頂元素就是上一級(jí)元素的直接后繼。
JavaScript的事件模型:JavaScript Event Model
每一個(gè)dom節(jié)點(diǎn)都是一個(gè)handler,當(dāng)點(diǎn)擊節(jié)點(diǎn)時(shí), 它所對(duì)應(yīng)的父節(jié)點(diǎn)就是該handler的直接后繼, 這個(gè)handler可以選擇在自己的層級(jí)處理掉點(diǎn)擊事件,也可以選擇不處理,直接向后繼傳遞。 JavaWeb開發(fā)過濾器鏈:FileterChain in Web
一點(diǎn)體會(huì)
將設(shè)計(jì)模式的思想與OO原則相關(guān)聯(lián) 在設(shè)計(jì)模式中發(fā)現(xiàn)OO原則可以加深理解和記憶 最重要的是要去理解模式如何使我們?nèi)?yīng)對(duì)變化 如何讓我們能夠用一種抽象的方式來編程文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70322.html
相關(guān)文章
慕課網(wǎng)_《模式的秘密之單例模式》學(xué)習(xí)總結(jié)
時(shí)間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:?jiǎn)卫J胶?jiǎn)介 1-1 簡(jiǎn)介 單例模式 概念及應(yīng)用場(chǎng)合 餓漢模式 懶漢模式 餓漢模式與懶漢模式的區(qū)別 什么是設(shè)計(jì)模式 是一套被反...
慕課網(wǎng)_《模式的秘密之工廠模式》學(xué)習(xí)總結(jié)
摘要:時(shí)間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。這對(duì)所有形態(tài)的工廠模式都是重要的這個(gè)系統(tǒng)的產(chǎn)品有至少一個(gè)的產(chǎn)品族同屬于一個(gè)產(chǎn)品族的產(chǎn)品是設(shè)計(jì)成在一起使用的。 時(shí)間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.c...
慕課網(wǎng)_《模式的秘密之適配器模式》學(xué)習(xí)總結(jié)
摘要:時(shí)間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章適配器模式的簡(jiǎn)介簡(jiǎn)介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個(gè)類的接口,轉(zhuǎn)換成客戶期望的另外一個(gè)接口。 時(shí)間:2017年08月29日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s.....
慕課網(wǎng)_《模式的秘密之模版模式》學(xué)習(xí)總結(jié)
摘要:時(shí)間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。案例介紹飲料機(jī)配置模版把水煮沸泡飲料把飲料倒進(jìn)杯子加調(diào)味料第二章模版模式實(shí)現(xiàn)基本框架代碼編寫編寫類模版模式抽象基類,為所有子類提供一個(gè)算法框架。 時(shí)間:2017年09月02日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源...
慕課網(wǎng)_《模式的秘密之策略模式》學(xué)習(xí)總結(jié)
時(shí)間:2017年08月31日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:策略模式簡(jiǎn)介 1-1 簡(jiǎn)介 課程大綱 什么是策略模式 策略模式如何實(shí)現(xiàn) 策略模式總結(jié)篇 實(shí)例案例分享 日常生活中的策略 Wor...
發(fā)表評(píng)論
0條評(píng)論
jsyzchen
男|高級(jí)講師
TA的文章
閱讀更多
pip3安裝tensorflow
閱讀 2779·2023-04-26 01:47
rnn
閱讀 3591·2023-04-25 23:45
4G DTU+MODBUS溫濕度傳感器+MQTT連接電信云
閱讀 2461·2021-10-13 09:39
程序員的自我修養(yǎng) 第四章 庫(kù)與運(yùn)行庫(kù) - 系統(tǒng)調(diào)用 中斷
閱讀 606·2021-10-09 09:44
自己的主機(jī)做服務(wù)器網(wǎng)站如何備案-我用自己的電腦做服務(wù)器,網(wǎng)站怎么備案?
閱讀 1789·2021-09-22 15:59
HTML和DIV表格在線生成工具 可視化拖拽畫表格
閱讀 2761·2021-09-13 10:33
Python爬蟲實(shí)戰(zhàn)之爬淘寶商品并做數(shù)據(jù)分析,現(xiàn)在賺錢沒點(diǎn)技術(shù)還真不行!
閱讀 1706·2021-09-03 10:30
[CSS]關(guān)于盒子模型
閱讀 656·2019-08-30 15:53
閱讀需要支付1元查看