在王者荣耀商城中,玩家可以参与夺宝抽奖。夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖;在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者通过270钻石/积分连续抽奖5次;其中,当钻石夺宝幸运值达到201时,可以获得稀有王者水晶,当积分夺宝幸运值达到361时,可以获得稀有荣耀水晶;玩家可以使用王者水晶或荣耀水晶换取特定的英雄、皮肤、装备等。

在很多情况下,可以处理某个请求的对象不止一个。很多对象都可以处理申请,而且它们构成一条链,请求沿着这条链传递,这条链就称为职责链。

针对以上描述,王者荣耀中的夺宝就是责任链模式在王者荣耀中应用的例子。在这个问题中,玩家通过点击60钻石/积分抽一次或者270钻石/积分抽五次实现抽奖结果。

具体而言,我们首先通过一个接口实现接收用户提交的请求,再通过三个类的实例实现具体的处理请求操作;其中,通过类“60钻石/积分抽一次”实现在14种奖品中随机得到一个奖品、类“270钻石/积分抽五次”实现在14种奖品中随机得到五个奖品、类“幸运值达到一定数值之后”实现获得稀有水晶的奖励。

责任链模式

责任链模式理解:高度概括:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 。

在设计Java模式时,可能需要设计很多对象来满足用户的请求。

责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做出处理,不再将用户的请求传递给责任链上的下一个对象,如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象。

责任链模式结构中的两种角色

处理者:是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法

具体处理者:具体处理者是实现处理者接口的类的实例。具体处理者通过调用处理者接口规定的方法,处理用户的请求,即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理有关数据;否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象。

责任链模式的优缺点

优点

①责任链中的对象只和自己的后继是低耦合关系和其他对象毫无关联;

②当在处理者中分配职责时,责任链给应用程序更多的灵活性;

③应用程序可以动态的增加,删除处理者或重新指派处理者的职责;

④应用程序可以动态的改变处理者之间的先后顺序;

⑤使用责任链的用户不必知道处理者的信息,用户不会知道到底是哪个对象处理了他的请求;

缺点

①不能保证请求一定被接收:没有明确接收者,不能确保一定被处理;

②对于太长的职责链,影响系统性能。建链不当可能出现死循环。

责任链模式的适用情景

①有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象;

②希望用户不必明确指定接收者的情况下,向多个接收者的一个提交请求;

③程序希望动态制定可处理用户请求的对象集合。

三、王者荣耀角度下实现责任链模式结构图及代码

实现此责任链模式的UML类图

eclipse结构图

主函数【应用(Application)】

Application.java

package angle_responsibility;
/*
* 测试应用类
*/
import angle_responsibility.Application;
import angle_responsibility.Diamond60DrawAPrize;
import angle_responsibility.Handler;
import angle_responsibility.Diamond270DrawFivePrizes;
import angle_responsibility.RareCrystalOfKings;
public class Application {
private Handler diamond60,diamond270,rareDiamond; //责任链上的对象
public void createChain(){ //建立责任链diamond60=new Diamond60DrawAPrize();diamond270=new Diamond270DrawFivePrizes();rareDiamond=new RareCrystalOfKings();diamond60.setNextHandler(diamond270);diamond270.setNextHandler(rareDiamond);}
public void reponseClient(int number){ //响应用户的请求diamond60.handleRequest(number);}
public static void main(String args[]){Application application=new  Application();application.createChain();System.out.println("当点击“60钻石”抽一次时:");System.out.print("[购买成功]");application.reponseClient(60);System.out.println("---------------------------");System.out.println("当点击“270钻石”抽五次时:");System.out.print("[购买成功]");application.reponseClient(270);System.out.println("---------------------------");System.out.println("当钻石抽奖“幸运值达201时”:");System.out.print("[购买成功]");application.reponseClient(201);}
}

处理者(Handler)

Handler.java

package angle_responsibility;
/*
* 角色1:处理者 :是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法
*/
import angle_responsibility.Handler;
public interface Handler {
public abstract void handleRequest(int number); //具体处理用户请求60钻石抽一次还是270钻石抽五次
public abstract void setNextHandler(Handler handler);
}

具体处理者(ConcreteHandler)

Diamond60DrawAPrize .java

package angle_responsibility;
/*
* 角色2.1:具体处理者 :具体处理者是实现处理者接口的类的实例
* 具体处理者通过调用处理者接口规定的方法,处理用户的请求
* 即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中
* 如果发现能处理用户的请求,就处理有关数据
* 否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象
*/
import angle_responsibility.Handler;
public class Diamond60DrawAPrize implements Handler{
private Handler handler; //存放当前处理者后继的Hander接口变量
public void handleRequest(int number){
if(number==60){ //60钻石抽一次String random = "";String[] doc = {"白起", "夏侯惇", "甄姬", "金币288","小喇叭5","铭文碎片1600", "铭文碎片400","铭文碎片100", "铭文碎片25", "爱心气球(3日)", "亲密玫瑰","钻石48","龙域领主体验卡"};
int index = (int) (Math.random() * doc.length); //随机选取其一输出random = doc[index];System.out.println(random);}
elsehandler.handleRequest(number); //将请求传递给下一个处理者}
public void setNextHandler(Handler handler){
this.handler=handler;}
}

Diamond270DrawFivePrizes.java

package angle_responsibility;
/*
* 角色2.2:具体处理者 :具体处理者是实现处理者接口的类的实例
* 具体处理者通过调用处理者接口规定的方法,处理用户的请求
* 即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中
* 如果发现能处理用户的请求,就处理有关数据
* 否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象
*/
public class Diamond270DrawFivePrizes implements Handler{
private Handler handler; //存放当前处理者后继的Hander接口变量
public void handleRequest(int number){
if(number==270){ //270钻石抽五次String random,random1,random2,random3,random4 = "";String[] doc = {"白起", "夏侯惇", "甄姬", "金币288","小喇叭5","铭文碎片1600", "铭文碎片400","铭文碎片100", "铭文碎片25", "爱心气球(3日)", "亲密玫瑰","钻石48","龙域领主体验卡"};
int index = (int) (Math.random() * doc.length); //随机选取其五输出random = doc[index];System.out.print(random+"、");
int index1 = (int) (Math.random() * doc.length);random1 = doc[index1];System.out.print(random1+"、");
int index2 = (int) (Math.random() * doc.length);random2 = doc[index2];System.out.print(random2+"、");
int index3 = (int) (Math.random() * doc.length);random3 = doc[index3];System.out.print(random3+"、");
int index4 = (int) (Math.random() * doc.length);random4 = doc[index4];System.out.println(random4);}
elsehandler.handleRequest(number); //将请求传递给下一个处理者}
public void setNextHandler(Handler handler){
this.handler=handler;}
}

RareCrystalOfKings.java

package angle_responsibility;
/*
* 角色2.3:具体处理者 :具体处理者是实现处理者接口的类的实例
* 具体处理者通过调用处理者接口规定的方法,处理用户的请求
* 即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中
* 如果发现能处理用户的请求,就处理有关数据
* 否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象
*/
public class RareCrystalOfKings implements Handler{
private Handler handler; //存放当前处理者后继的Hander接口变量
public void handleRequest(int number){
if(number==201){ //当幸运值满201时,出稀有水晶System.out.println("【稀有】王者水晶");}
elsehandler.handleRequest(number); //将请求传递给下一个处理者}
public void setNextHandler(Handler handler){
this.handler=handler;}
}

运行结果截图

因为出奖品是随机的,所以多取几张图作为测试

第一次抽:

第二次抽:

第N次抽:

来源:blog.csdn.net/IT_charge/article/details/105011204/

推荐阅读
1. GitHub 上有什么好玩的项目?
2. Linux 运维必备 150 个命令汇总
3. SpringSecurity + JWT 实现单点登录
4. 100 道 Linux 常见面试题

责任链模式在王者荣耀中的应用相关推荐

  1. 王者荣耀java,责任链模式在王者荣耀中的应用

    来源:https://blog.csdn.net/IT_charge 一.简述 在王者荣耀商城中,玩家可以参与夺宝抽奖.夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖:在平常,两种夺宝抽奖方式均可以 ...

  2. 责任链模式在王者荣耀中的应用,妙啊!

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  3. 责任链模式在王者荣耀中的应用,妙!

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 7 分钟. 来自:blog.csdn.net/IT_charge/article/details/105011204/ # 简 ...

  4. 设计模式之责任链模式在王者荣耀中的应用,学习到了!

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:荣仔!最靓的仔! 来源:https://blog.cs ...

  5. 【深入设计模式】责任链模式—责任链模式及责任链模式在源码中的应用

    文章目录 1. 责任链模式 1.1 责任链模式简介 1.2 责任链模式结构 1.3 责任链模式示例 2. 责任链模式在源码中的应用 2.1 Servlet 中的责任链模式 2.2 Spring 中的责 ...

  6. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

  7. 责任链模式在业务实践中的思考与改进

    文章目录 背景 责任链基本应用 一些小问题: 读扩散问题 膨胀的上下文 消灭"幽灵字段" 大泥球Processor 总结 背景 众所周知,软件开发没有银弹,但总有一些经典的设计模式 ...

  8. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之责任链模式

    · 责任链模式在王者荣耀中的应用 · 一.简述 在王者荣耀商城中,玩家可以参与夺宝抽奖.夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖:在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者 ...

  9. 用王者荣耀来理解java设计模式之责任链模式

    在王者荣耀商城中,玩家可以参与夺宝抽奖.夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖:在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者通过270钻石/积分连续抽奖5次:其中,当钻石夺 ...

最新文章

  1. Activity调用栈的分析
  2. 一个具有20位地址和32位字长的存储器_存储器层次结构(三):高速缓存
  3. vijos 1067 Warcraft III 守望者的烦恼 矩阵
  4. linux mariadb 乱码,配置mariadb远程访问权限,解决数据库乱码问题
  5. jdbcTemplate数据库连接的使用
  6. 关于 时钟抖动 Jitter 和 偏移 Skew
  7. [one day one question] webpack打包压缩 ES6 js、.vue报错
  8. 低代码开发平台_低代码开发平台测评——伙伴云
  9. Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
  10. 【csdn】markdown使用教程
  11. linux 内核 内存管理 bootmem alloctor 的初始化
  12. fclose会写入硬盘吗 linux_Linux 文件操作总结
  13. protues仿真控制舵机
  14. 服务器内存有很多不显示,这里大神多,帮忙看看这个服务器内存是不是真的
  15. 如何关闭eslint相关规则
  16. English Grammar(二)
  17. PHP函数计算中英文字符串长度的方法
  18. ESP8266 MP3制作——esp8266联网
  19. 《天下无贼》经典台词与遗憾
  20. Graham算法解决凸包问题

热门文章

  1. 六种常用软件设计模式—责任链模式
  2. 九款可免费下载的app导航条
  3. golang net包tcp超时设置并判断是否超时
  4. 微信公众号接入Chat GPT实现人工智能对话聊天(java代码实现)
  5. mysql建立班级表_MySQL创建表与表之间的联系
  6. pycrypto的用法
  7. 阿里巴巴工程师为什么用寻找第83行代码向代码致敬
  8. 基于GIS的房产中介管理系统 c# arcgis arcengine 可用于毕设研究
  9. Java学习系列(四)Java面向对象之修饰符、封装、继承、多态详解
  10. 20170208找女朋友之路思考总结