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