模式定义
职责链模式(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 ̄)づ╭❤ ~拜托啦