【框架-netty】在学习netty之前的门槛:1.责任链模式

在学习netty之前的门槛:1.责任链模式(是什么?)

· 简单来说:将一个消息的传递想象成在一个单向管道之中传递,管道上有许多开关,当前一个开关关闭之后,后面的所有开关都将无法收到消息。
· 所以这个实现就要求,前一个开关对象要持有下一个开关对象的引用。

二、以鉴定装备为例(怎么实现?)

当我们费尽千辛万苦,组队杀BOSS,终于掉落了一件装备时,此时我们需要会城镇掏上一笔费用给鉴定师来鉴定这件装备的品级。
假设装备的品级有三种:青铜、黄金和超神。
只有当我们检测到当前装备是【青铜】的时候,这件装备才有可能是【黄金】装备。
同样的,只有检测到是【黄金】装备时,才有可能是【超神】装备。
那也就是说,只有当一件装备是【青铜】的时候,我们才需要去鉴定他是不是【黄金】的。或者,只有它是【黄金】的,我们才回去鉴定他是否为【超神】装备。
所以我们的判定逻辑一定是:先鉴定是否为【青铜】,如果是则进入【黄金】鉴定,否则结束鉴定。

三、代码怎么写?

3.1.先给出装备属性的抽象类:只有一个抽象方法为outAttr()方法,目的是输出鉴定结果。其他的重要方法由父类编写完成,减少子类的代码冗余。

public abstract class AbstractEquipmentArrt {
	public static int LEGENDARY = 3;
	public static int GOLDEN = 2;
	public static int BRONZE = 1;
	public int level;
	AbstractEquipmentArrt nextAttr = null;
	
	public void identifyEquipmentAttr(int level,String msg) {
		if(level >= this.level) {
			outAttr(msg);
		}
		if(this.nextAttr != null) {
			this.nextAttr.identifyEquipmentAttr(level, msg);
		}
	}
	
	public void setNextAttr(AbstractEquipmentArrt next) {
		this.nextAttr = next;
	}
	
	public abstract void outAttr(String msg);
	
}

3.2.接下来是三个实现类:
3.2.1.青铜装备鉴定

public class Bronze extends AbstractEquipmentArrt{

	public Bronze(int level) {
		this.level = level;
	}
	
	@Override
	public void outAttr(String msg) {
		System.out.println("哦~恭喜你,经过第一步鉴定,["+msg+"]至少是【青铜】级别的装备!");
	}
}

3.2.2.黄金装备鉴定

public class Golden extends AbstractEquipmentArrt{

	public Golden(int level) {
		this.level = level;
	}
	
	@Override
	public void outAttr(String msg) {
		System.out.println("哦~太棒了,经过第二步鉴定,["+msg+"]至少是【黄金】级别的装备!");
	}
}

3.2.3.超神装备鉴定

public class Legendary extends AbstractEquipmentArrt{

	public Legendary(int level) {
		this.level = level;
	}
	
	@Override
	public void outAttr(String msg) {
		System.out.println("哦~奇迹啊,经过第三步鉴定,["+msg+"]至少是【超神】级别的装备!");
	}
}

3.3.最后,我们需要在调用该流程的调用类的内部完成两个方法:
3.3.1.实现一个将 各个开关持有下一个开关的引用,并拿到这个链的头:getChainHead();
3.3.2.实现一个主方法并设置装备:

public class ResponseChainMain {
	
	static Bronze bronze = null;
	static Golden golden = null;
	static Legendary legendary = null;
	
	public static void main(String[] args) {
		String equipment1 = "流光幻影剑";
		int eq1Level = 3;
		String equipment2 = "枯叶刀";
		int eq2Level = 2;
		
		AbstractEquipmentArrt chain = getChainHead();
		chain.identifyEquipmentAttr(eq1Level, equipment1);
		
	}
	
	public static AbstractEquipmentArrt getChainHead() {
		bronze = new Bronze(AbstractEquipmentArrt.BRONZE );
		golden = new Golden(AbstractEquipmentArrt.GOLDEN);
		legendary = new Legendary(AbstractEquipmentArrt.LEGENDARY);
		bronze.setNextAttr(golden);
		golden.setNextAttr(legendary);
		return bronze;
	}
}

4.我们来看一下结果:
在这里插入图片描述

责任链学习结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值