Java设计模式之责任链模式和一拳超人

名称

Chain of responsibility


举例

一拳超人

威胁等级

这里写图片描述
根据其威胁程度分为:神,龙,鬼,虎,狼有时也被用作表示怪人或怪物的强度。

神:
(如:波罗斯)
可能导致人类灭亡的危机;

龙:
(如:疫苗人)
可能导致数个城镇被毁的危机;

鬼:
(如:海底王)
导致一个城镇机能停止或毁灭的危机;

虎:
(如:螃蟹人)
造成大量伤亡的危机;

狼:
(如:盗贼,小偷)
有危险因素出现。


英雄定位


这里写图片描述


琦玉老师:
没有什么是一拳解决不了的,如果有就认真一拳。
S级:
英雄的顶点,可应对灾害级别鬼~龙。其他级别英雄口中的“怪物”,个性都非常强,缺乏协作性(如:银色獠牙、战栗龙卷)
A级:
大部分英雄的目标,可应对灾害级别虎~鬼(如:甜心假面)
B级:
比普通人强大许多,可应对灾害级别狼~虎(如:地狱吹雪)
C级:
普通人或者比普通人略强,主要工作是惩治小偷或窃贼等(如:无证骑士)


分析


以一拳超人为例,可以看到不同级别的英雄可以应对不同的威胁,如果在动画中普通民众遇到危险会向英雄协会求救。
这时候英雄协会会根据灾害等级来派出等级不同的英雄来处理这些灾祸,如果低级的英雄处理不了就找高级的英雄,如果S级的英雄都处理不了,那么只有琦玉老师也就是我们的一拳超人可以处理了。如果琦玉老师这时候在超市里等超市减价就不一定了有时间处理了。这个时候就会没有人处理这个请求。


这里写图片描述


示例代码

abstract class Hero{

    public static final int ONEPUNCHMAN=1000;//琦玉老师
    public static final int SHERO=4;//S级别英雄
    public static final int AHERO=3;//A级别英雄
    public static final int BHERO=2;//B级别英雄
    public static final int CHERO=1;//C级别英雄


    protected int level;//英雄等级

    protected Hero nextHero;//下一个等级的英雄

    public void setNextHero(Hero nextHero){
          this.nextHero = nextHero;
       }

    public void logMessage(int disaterlevel, String enemy){
          if(this.level >=disaterlevel){
              HeroWin(enemy);
          }else {
              HeroLose(enemy);
          }
          if(nextHero !=null){
             nextHero.logMessage(disaterlevel, enemy);
          }
       }

    abstract protected void HeroWin(String enemy);
    abstract protected void HeroLose(String enemy);
    public abstract String toString();
}

class OnePunchMan extends Hero{

    public OnePunchMan(int level){
        this.level=level;
    }
    @Override
    protected void HeroWin(String enemy) {
         System.out.println("我是一拳超人 我打败了"+enemy);       
    }
    @Override
    protected void HeroLose(String enemy) {
         System.out.println("我是一拳超人 我打败了 "+enemy);      

    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "一拳超人";
    }

}
class SHero extends Hero{
    public SHero(int level) {
        this.level=level;
    }
    @Override
    protected void HeroWin(String enemy) {
        System.out.println("我是S级英雄 我打败了"+enemy);
    }
    @Override
    protected void HeroLose(String enemy) {
         System.out.println("我是S级英雄 我没有打败 "+enemy+"交给了"+this.nextHero.toString());      

    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "S级英雄";
    }
}
class AHero extends Hero{
    public AHero(int level) {
        this.level=level;
    }
    @Override
    protected void HeroWin(String enemy) {
        System.out.println("我是A级英雄 我打败了 "+enemy);
    }
    @Override
    protected void HeroLose(String enemy) {
         System.out.println("我是A级英雄 我没有打败 "+enemy+"交给了"+this.nextHero.toString());      

    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "A级英雄";
    }
}
class BHero extends Hero{
    public BHero(int level) {
        this.level=level;
    }
    @Override
    protected void HeroWin(String enemy) {
        System.out.println("我是B级英雄 我打败了 "+enemy);
    }
    @Override
    protected void HeroLose(String enemy) {
         System.out.println("我是B级英雄 我没有打败 "+enemy+"交给了"+this.nextHero.toString());      

    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "B级英雄";
    }
}
class CHero extends Hero{
    public CHero(int level) {
        this.level=level;
    }
    @Override
    protected void HeroWin(String enemy) {
        System.out.println("我是C级英雄 我打败了 "+enemy);
    }
    @Override
    protected void HeroLose(String enemy) {
         System.out.println("我是C级英雄 我没有打败 "+enemy+"交给了"+this.nextHero.toString());      

    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "C级英雄";
    }
}

class SuperHeroClub{

    //对灾难进行评级
    public static final int GODLEVEL=5;//神级
    public static final int DRAGONLEVEL=4;//龙级
    public static final int GHOSTLEVEL=3;//鬼级
    public static final int TIGERLEVEL=2;//虎级
    public static final int WOLFLEVEL=1;//狼级

    private Hero onepunch,sHero,aHero,bHero,cHero;
    public SuperHeroClub() {
         onepunch=new OnePunchMan(Hero.ONEPUNCHMAN);
         sHero=new SHero(Hero.SHERO);
         aHero=new AHero(Hero.AHERO);
         bHero=new BHero(Hero.BHERO);
         cHero=new CHero(Hero.CHERO);
    }
    //现在构造一个超级英雄链条
    public Hero getSuperChain() {
        this.cHero.setNextHero(this.bHero);
        this.bHero.setNextHero(this.aHero);
        this.aHero.setNextHero(this.sHero);
        this.sHero.setNextHero(this.onepunch);
        return this.cHero;

    }
}

public class Client{

    public static void main(String[]args) {

        //得到呼救
        SuperHeroClub superHeroClub=new SuperHeroClub();
        Hero heroChain=superHeroClub.getSuperChain();
        heroChain.logMessage(superHeroClub.GODLEVEL, "波罗斯");

    }

}

输出结果:

我是C级英雄 我没有打败 波罗斯交给了B级英雄
我是B级英雄 我没有打败 波罗斯交给了A级英雄
我是A级英雄 我没有打败 波罗斯交给了S级英雄
我是S级英雄 我没有打败 波罗斯交给了一拳超人
我是一拳超人 我打败了波罗斯
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值