在学习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.我们来看一下结果: