电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java通俗易懂系列設計模式之責任鏈模式

瀏覽:67日期:2022-08-13 17:58:53
概述

責任鏈設計模式是行為設計模式之一。

Java通俗易懂系列設計模式之責任鏈模式

責任鏈模式用于在軟件設計中實現松散耦合,其中來自客戶端的請求被傳遞到對象鏈以處理它們。然后鏈中的對象將自己決定誰將處理請求以及是否需要將請求發送到鏈中的下一個對象。

JDK中的責任鏈模式示例

讓我們看一下JDK中責任鏈模式的例子,然后我們將繼續實現這種模式的真實例子。我們知道在try-catch塊代碼中我們可以有多個catch塊。這里每個catch塊都是處理該特定異常的處理器。

因此當try塊中發生任何異常時,它會發送到第一個catch塊進行處理。如果catch塊無法處理它,它會將請求轉發到鏈中的下一個對象,即下一個catch塊。如果即使最后一個catch塊也無法處理它,那么異常將被拋出鏈接到調用程序。

責任鏈設計模式示例

責任鏈模式的一個很好的例子是ATM分配機器。用戶按照定義的貨幣賬單輸入要分配的金額和機器分配金額,例如50美元,20美元,10美元等。如果用戶輸入的數量不是10的倍數,則會引發錯誤。我們將使用Chain of Responsibility模式來實現此解決方案。鏈將以與下圖相同的順序處理請求。

Java通俗易懂系列設計模式之責任鏈模式

請注意,我們可以在單應用程序中輕松實現此解決方案,但隨后復雜性將增加,解決方案將緊密耦合。因此,我們將創建一系列分配系統,以分配50美元,20美元和10美元的賬單。

責任鏈設計模式 - 基類和接口

我們可以創建一個類Currency來存儲分配和鏈實現使用的數量。

Currency.java

package com.journaldev.design.chainofresponsibility;public class Currency {private int amount;public Currency(int amt){this.amount=amt;}public int getAmount(){return this.amount;}}

基接口應該有一個方法來定義鏈中的下一個處理器以及處理請求的方法。我們的ATM Dispense界面如下所示。

DispenseChain.java

package com.journaldev.design.chainofresponsibility;public interface DispenseChain {void setNextChain(DispenseChain nextChain);void dispense(Currency cur);}責任鏈模式 - 鏈實現

我們需要創建不同的處理器類來實現DispenseChain接口并提供分配方法的實現。由于我們正在開發我們的系統以使用三種類型的貨幣賬單--50美元,20美元和10美元,我們將創建三個具體實施。Dollar50Dispenser.java

package com.journaldev.design.chainofresponsibility;public class Dollar50Dispenser implements DispenseChain {private DispenseChain chain;@Overridepublic void setNextChain(DispenseChain nextChain) {this.chain=nextChain;}@Overridepublic void dispense(Currency cur) {if(cur.getAmount() >= 50){int num = cur.getAmount()/50;int remainder = cur.getAmount() % 50;System.out.println('Dispensing '+num+' 50$ note');if(remainder !=0) this.chain.dispense(new Currency(remainder));}else{this.chain.dispense(cur);}}}

Dollar20Dispenser.java

package com.journaldev.design.chainofresponsibility;public class Dollar20Dispenser implements DispenseChain{private DispenseChain chain;@Overridepublic void setNextChain(DispenseChain nextChain) {this.chain=nextChain;}@Overridepublic void dispense(Currency cur) {if(cur.getAmount() >= 20){int num = cur.getAmount()/20;int remainder = cur.getAmount() % 20;System.out.println('Dispensing '+num+' 20$ note');if(remainder !=0) this.chain.dispense(new Currency(remainder));}else{this.chain.dispense(cur);}}}

Dollar10Dispenser.java

package com.journaldev.design.chainofresponsibility;public class Dollar10Dispenser implements DispenseChain {private DispenseChain chain;@Overridepublic void setNextChain(DispenseChain nextChain) {this.chain=nextChain;}@Overridepublic void dispense(Currency cur) {if(cur.getAmount() >= 10){int num = cur.getAmount()/10;int remainder = cur.getAmount() % 10;System.out.println('Dispensing '+num+' 10$ note');if(remainder !=0) this.chain.dispense(new Currency(remainder));}else{this.chain.dispense(cur);}}}

這里要注意的重點是分配方法的實施。您會注意到每個實現都在嘗試處理請求,并且根據數量,它可能會處理部分或全部部分。如果其中一個鏈不能完全處理它,它會將請求發送到鏈中的下一個處理器以處理剩余的請求。如果處理器無法處理任何內容,它只會將相同的請求轉發到下一個鏈。

責任鏈設計模式 - 創建鏈

這是非常重要的一步,我們應該仔細創建鏈,否則處理器可能根本沒有得到任何請求。例如,在我們的實現中,如果我們將第一個處理器鏈保持為Dollar10Dispenser然后Dollar20Dispenser,那么請求將永遠不會被轉發到第二個處理器,并且鏈將變得無用。

這是我們的ATM Dispenser實現,用于處理用戶請求的數量。

ATMDispenseChain.java

package com.journaldev.design.chainofresponsibility;import java.util.Scanner;public class ATMDispenseChain {private DispenseChain c1;public ATMDispenseChain() {// initialize the chainthis.c1 = new Dollar50Dispenser();DispenseChain c2 = new Dollar20Dispenser();DispenseChain c3 = new Dollar10Dispenser();// set the chain of responsibilityc1.setNextChain(c2);c2.setNextChain(c3);}public static void main(String[] args) {ATMDispenseChain atmDispenser = new ATMDispenseChain();while (true) {int amount = 0;System.out.println('Enter amount to dispense');Scanner input = new Scanner(System.in);amount = input.nextInt();if (amount % 10 != 0) {System.out.println('Amount should be in multiple of 10s.');return;}// process the requestatmDispenser.c1.dispense(new Currency(amount));}}}

當我們運行上面的應用程序時,我們得到如下的輸出。

Enter amount to dispense

530

Dispensing 10 50$ note

Dispensing 1 20$ note

Dispensing 1 10$ note

Enter amount to dispense

100

Dispensing 2 50$ note

Enter amount to dispense

120

Dispensing 2 50$ note

Dispensing 1 20$ note

Enter amount to dispense

15

責任鏈設計模式類圖

我們的ATM分配示例的責任鏈設計模式實現如下圖所示。

Java通俗易懂系列設計模式之責任鏈模式

責任鏈設計模式重點 客戶端不知道鏈的哪個部分將處理請求,它將把請求發送到鏈中的第一個對象。例如,在我們的程序中,ATMDispenseChain不知道誰在處理分配輸入金額的請求。 鏈中的每個對象都有自己的實現來處理請求,全部或部分或將其發送到鏈中的下一個對象。 鏈中的每個對象都應該引用鏈中的下一個對象來轉發請求,它由java組成。 仔細創建鏈非常重要,否則可能會出現請求永遠不會轉發到特定處理器或鏈中沒有能夠處理請求的對象的情況。在我的實現中,我添加了對用戶輸入數量的檢查,以確保它被所有處理器完全處理,但是如果請求到達最后一個對象并且鏈中沒有其他對象,我們可能不檢查它并拋出異常將請求轉發給。這是一個設計決定。 責任鏈設計模式很好地實現了失去耦合,但如果大多數代碼在所有實現中都很常見,那么它會帶來很多實現類和維護問題的權衡。JDK中的責任鏈模式示例 java.util.logging.Logger#log() javax.servlet.Filter#doFilter()

以上就是Java通俗易懂系列設計模式之責任鏈模式的詳細內容,更多關于Java設計模式的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 仿真植物|仿真树|仿真花|假树|植物墙 - 广州天昆仿真植物有限公司 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 昊宇水工|河北昊宇水工机械工程有限公司 | 澳威全屋定制官网|极简衣柜十大品牌|衣柜加盟代理|全屋定制招商 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 长信科技产业园官网_西安厂房_陕西标准工业厂房| 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | LINK FASHION 童装·青少年装展 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 北京中创汇安科贸有限公司| 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 次氯酸钠厂家,涉水级次氯酸钠,三氯化铁生产厂家-淄博吉灿化工 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格| 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 100国际学校招生 - 专业国际学校择校升学规划 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 免费网站网址收录网_海企优网站推荐平台 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 昆山PCB加工_SMT贴片_PCB抄板_线路板焊接加工-昆山腾宸电子科技有限公司 | 巩义市科瑞仪器有限公司| led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 开云(中国)Kaiyun·官方网站 - 登录入口 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 |