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

模式定义

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

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nan_black

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值