模式定义

职责链模式(Chain of Responsibility Pattern):避免请求发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为模式。

模式结构


Handel(抽象处理者): 抽象处理者定义了一个处理请求的接口,它一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个自类型(抽象处理类型)的对象,作为其下家的引用。通过该引用,处理者可以连成一条链。

ConcreteHandle(具体处理者): 具体处理者是抽象处理者的子类,它可以处理用户请求,在具体处理者中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者。在具体处理者中可以访问链中下一个对象,以便请求的转发。

Clint(客户类): 客户类向链中的对象提出最初的请求,客户类只需要关心链的源头,而无需关心请求的处理细节以及请求的传递过程等。

实例:报菜名识菜系

中国是一个餐饮文化大国,长期以来在某一地区由于地理环境、气候物产、文化传统以及民族习俗等因素的影响,形成有一定亲缘承袭关系、菜点风味相近,知名度较高,并为部分群众喜爱的地方风味著名流派称作菜系。其中,粤菜、川菜、鲁菜、淮扬菜、浙菜、闽菜、湘菜、徽菜享称为“八大菜系”。
有朋自远方来,不亦说乎?你想做个手机程序,在点菜时根据菜名可以方便地查询到该菜所属的菜系。请编写程序模拟该功能。为了方便模拟各菜系只挑选了一个派别,每个派别只选了6个菜。
1、鲁菜
汤爆双脆、糖醋鲤鱼、奶汤蒲菜、济南烤鸭、九转大肠、宫保鸡丁
2、川菜
麻婆豆腐、回锅肉、宫保鸡丁、盐烧白、粉蒸肉、夫妻肺片
3、粤菜
龙虎斗、白灼虾、烤乳猪、香芋扣肉、黄埔炒蛋、炖禾虫
4、苏菜
摸刺刀鱼、马鞍桥、葵花肉丸、灌汤肉包、三套鸭、大煮干丝
5、闽菜
佛跳墙、红糟鸡、淡糟香螺片,鸡汤汆海蚌、豆腐蛎、荔枝肉
6、浙菜
西湖醋鱼、东坡肉、炸响铃、红烧栗子肉、木樨肉、老鸭煲
7、湘菜
“东安子鸡”、“红煨鱼翅”、“腊味合蒸”、“面包全鸭”、“油辣冬笋尖”、“板栗烧菜心”
8、徽菜
“清香炒悟鸡”“生熏仔鸡”“八大锤”“毛峰熏鲥鱼”“火烘鱼”“蟹黄虾盅”

职责链模式思路


一道菜品让每个菜系的专家判断是不是本系的菜品,如果不是就传递给下一个专家,如果是就不再传递,并得出此道菜品的派系。

设计类图

代码

Cai类:

public class Cai {private String name;public Cai(String name){this.name=name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

(抽象处理者)Manager类:

public abstract class Manager {protected Manager successor;public void setSuccessor(Manager successor){this.successor=successor;}public abstract void handleRequest(Cai cai);
}

(具体处理者)Chuan类:

public class Chuan extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("麻婆豆腐")){System.out.println("是川菜");}else if(cai.getName().equals("回锅肉")){System.out.println("是川菜");}else if(cai.getName().equals("宫保鸡丁")){System.out.println("是川菜");}else if(cai.getName().equals("盐烧白")){System.out.println("是川菜");}else if(cai.getName().equals("粉蒸肉")){System.out.println("是川菜");}else if(cai.getName().equals("夫妻肺片")){System.out.println("是川菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

(具体处理者)Hui类:

public class Hui extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("清香炒悟鸡")){System.out.println("是徽菜");}else if(cai.getName().equals("生熏仔鸡")){System.out.println("是徽菜");}else if(cai.getName().equals("八大锤")){System.out.println("是徽菜");}else if(cai.getName().equals("毛峰熏鲥鱼")){System.out.println("是徽菜");}else if(cai.getName().equals("火烘鱼")){System.out.println("是徽菜");}else if(cai.getName().equals("蟹黄虾盅")){System.out.println("是徽菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

(具体处理者)Lu类:

public class Lu extends Manager{//传过来的是一个菜的对象public void handleRequest(Cai cai){if(cai.getName().equals("汤爆双脆")){System.out.println("是鲁菜");}else if(cai.getName().equals("糖醋鲤鱼")){System.out.println("是鲁菜");}else if(cai.getName().equals("奶汤蒲菜")){System.out.println("是鲁菜");}else if(cai.getName().equals("济南烤鸭")){System.out.println("是鲁菜");}else if(cai.getName().equals("九转大肠")){System.out.println("是鲁菜");}else if(cai.getName().equals("宫保鸡丁")){System.out.println("是鲁菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}}

(具体处理者)Min类:

public class Min extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("佛跳墙")){System.out.println("是闽菜");}else if(cai.getName().equals("红糟鸡")){System.out.println("是闽菜");}else if(cai.getName().equals("淡糟香螺片")){System.out.println("是闽菜");}else if(cai.getName().equals("鸡汤汆海蚌")){System.out.println("是闽菜");}else if(cai.getName().equals("豆腐蛎")){System.out.println("是闽菜");}else if(cai.getName().equals("荔枝肉")){System.out.println("是闽菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

(具体处理者)Su类:

public class Su extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("摸刺刀鱼")){System.out.println("是苏菜");}else if(cai.getName().equals("马鞍桥")){System.out.println("是苏菜");}else if(cai.getName().equals("葵花肉丸")){System.out.println("是苏菜");}else if(cai.getName().equals("灌汤肉包")){System.out.println("是苏菜");}else if(cai.getName().equals("三套鸭")){System.out.println("是苏菜");}else if(cai.getName().equals("大煮干丝")){System.out.println("是苏菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

(具体处理者)Xiang类:

public class Xiang extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("东安子鸡")){System.out.println("是湘菜");}else if(cai.getName().equals("红煨鱼翅")){System.out.println("是湘菜");}else if(cai.getName().equals("腊味合蒸")){System.out.println("是湘菜");}else if(cai.getName().equals("面包全鸭")){System.out.println("是湘菜");}else if(cai.getName().equals("油辣冬笋尖")){System.out.println("是湘菜");}else if(cai.getName().equals("板栗烧菜心")){System.out.println("是湘菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

(具体处理者)Yue类:

public class Yue extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("龙虎斗")){System.out.println("是粤菜");}else if(cai.getName().equals("白灼虾")){System.out.println("是粤菜");}else if(cai.getName().equals("烤乳猪")){System.out.println("是粤菜");}else if(cai.getName().equals("香芋扣肉")){System.out.println("是粤菜");}else if(cai.getName().equals("黄埔炒蛋")){System.out.println("是粤菜");}else if(cai.getName().equals("炖禾虫")){System.out.println("是粤菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

(具体处理者)Zhe类:

public class Zhe extends Manager{public void handleRequest(Cai cai){if(cai.getName().equals("西湖醋鱼")){System.out.println("是浙菜");}else if(cai.getName().equals("东坡肉")){System.out.println("是浙菜");}else if(cai.getName().equals("炸响铃")){System.out.println("是浙菜");}else if(cai.getName().equals("红烧栗子肉")){System.out.println("是浙菜");}else if(cai.getName().equals("木樨肉")){System.out.println("是浙菜");}else if(cai.getName().equals("老鸭煲")){System.out.println("是浙菜");}else{if(this.successor!=null){this.successor.handleRequest(cai);}}}
}

客户端类:

public class Client {/*** @param args*/public static void main(String[] args) {// TODO 自动生成方法存根Manager lu,chuan,yue,su,min,zhe,xiang,hui;chuan=new Chuan();hui=new Hui();lu=new Lu();min=new Min();su=new Su();xiang=new Xiang();yue=new Yue();zhe=new Zhe();//消息按照以下职责链传递,如果匹配就输出,不再往下传递消息chuan.setSuccessor(hui);hui.setSuccessor(lu);lu.setSuccessor(min);min.setSuccessor(su);su.setSuccessor(xiang);xiang.setSuccessor(yue);yue.setSuccessor(zhe);Cai c=new Cai("东坡肉");//找不到就什么也不输出lu.handleRequest(c);}}

运行结果:


最后

原创不易,如果对您有帮助,请点个赞再走呀(づ ̄3 ̄)づ╭❤ ~拜托啦

设计模式之职责链模式(图解+例题+java源码)相关推荐

  1. 设计模式之职责链模式应用例题

    设计模式之职责链模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军 ...

  2. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

  3. python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...

  4. 【设计模式】职责链模式(C#)

    [设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...

  5. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  7. 设计模式复习-职责链模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

  8. 设计模式之职责链模式

    定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式 类图: 责任连模式的结构 责任连 ...

  9. 『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路

    23种设计模式+额外常用设计模式汇总 (持续更新) 问题抽象 客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的. 对于客户端而言,无所谓谁来处理,反正有对象处理就 ...

最新文章

  1. 聊聊flink的NetworkEnvironmentConfiguration
  2. 什么是逻辑分析仪?逻辑分析仪的参数、使用步骤和优势
  3. Java开发中消息中间件的优势有哪些?
  4. Java 中的四种引用
  5. EV3 直接命令 - 第一课 无为的艺术
  6. Android 代码实现查看SQLite数据库中的表
  7. 【微信插件】P3微信插件测试使用步骤
  8. Web Hacking 101 中文版 五、HTML 注入
  9. The “FixedStepDiscrete“ solver cannot be used to simulate block diagram ‘foc_ruizi‘ because it conta
  10. 2022-2027年中国智能服务机器人行业发展监测及投资战略研究报告
  11. idea运行项目流程
  12. flutter 语音转文字(科大讯飞)
  13. copy和mutableCopy都是浅拷贝!!!
  14. C++的成员函数指针简要
  15. PHP实现简易的MVC框架
  16. 读吴晓波《历代经济变革得失》
  17. html asterisk 电话,WebGuide: Aplicació Web (HTML5) i Asterisk utilitzant VoIP
  18. tvs管参数数解读_关于TVS管选型的几个参数 2019-01-19
  19. OpenMV入门介绍
  20. WPF入门第四篇 WPF模板

热门文章

  1. 惠普p2055dn怎么停止打印_惠普打印机p2055dn怎么使用?
  2. vue搭建项目时遇到的一些问题记录
  3. IOT-OS之RT-Thread(十五)--- SDIO设备对象管理 + AP6181(BCM43362) WiFi模块
  4. 找不到虚拟机监控程序,请启用虚拟机监控程序支持(打开Windows Sandbox提示)
  5. Java写一个等腰三角形(数字符号都可)
  6. 瓦尔登湖--读后精选片段
  7. Docker镜像推送阿里云和私有库
  8. 5、第二课---大象喝水
  9. 关于2020年中国异常大面积洪涝的个人分析
  10. mysql sql外键的作用_SQL的主键和外键的作用