点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

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

  • 一、简述

  • 二、责任链模式

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


一、简述

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

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

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

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

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

二、责任链模式

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

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

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

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

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

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

责任链模式的优缺点:

优点:

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

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

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

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

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

缺点:

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

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

责任链模式的适用情景:

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

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

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

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

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

实现此责任链模式的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次抽:



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

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

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

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

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

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

  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. python 线程锁 共享全局变量 线程通信
  2. SVN项目锁定解决方案
  3. c语言08,C语言08 -- 指针
  4. TCP/IP GUIDE
  5. 本机用域名不能访问_域名注册申请网站域名注意事项
  6. 内存模型是怎么解决缓存一致性的
  7. 用OmniPeek快速定义的过滤器来抓网页提交信息
  8. 一个普通handler会持有activity引用吗_详解handler机制
  9. 浅入浅出 Android 安全:第四章 Android 框架层安全
  10. Linux环境通过java虚拟机定位程序问题位置的方法
  11. 自动化测试的理想境界:AppCrawler自动遍历工具
  12. 硬盘:协议-总线-接口
  13. Hibernate-逆向工程
  14. java arraylist 字符串数组_java中String,数组,ArrayList三者之间的转换
  15. psp c语言编程软件,PSP2000自制系统3.03OE-C如何傻瓜安装及系统测试
  16. (十:2020.08.28)CVPR 2018 追踪之论文纲要(译)
  17. vite报错 process is not defined
  18. HNU大一小学期作业三 棋盘
  19. 数据分析-思维分析逻辑day02
  20. 2020中国邮政总行信息技术岗校招笔试经历

热门文章

  1. 用python说童话故事
  2. 奇数阶矩阵,横竖斜加起来都相等算法(罗伯法幻方)
  3. mumu模拟器 连接不到adb 配置
  4. xavier上如何挂载SD卡
  5. DataStage 使用心得
  6. 在Windows下和MacBook中如何查找本地的字体文件
  7. 变压器接触不良导致带7812稳压模块的电源带负载能力减弱
  8. 迈出出道第一步,下一个社区之星就是你!(资深开发者必看)
  9. React路由报错You should not use Switch outside a Router
  10. 再学 SPI ——(一)SPI片选信号