1.简介在王者荣耀商城,玩家可以参与抽奖。开奖有两种,一种是积分开奖,一种是钻石开奖;平时两种寻宝抽奖方式都可以60钻石/点抽一次,或者270钻石/点连续抽5次;其中,钻石寻宝幸运值达到201可获得稀有王者水晶,积分寻宝幸运值达到361可获得稀有荣耀水晶;玩家可以使用王者水晶或荣耀水晶兑换特定的英雄、皮肤、装备等。在许多情况下,不止一个对象可以处理一个请求。许多对象都可以处理请求,并且它们形成一条链,请求沿着这条链传递。这条链称为责任链。综上所述,王者荣耀中的寻宝游戏就是责任链模型在王者荣耀中应用的一个例子。本题玩家通过点击60方块/点抽取一次或270方块/点抽取五次达到抽奖结果。具体来说,我们首先通过一个接口接收用户提交的请求,然后通过三个类实例来实现具体的处理请求操作;其中,通过类“60钻/点抽一次”,我们可以在14个奖品中随机获得一个奖品,类别“270钻石/点抽五次”实现从14种奖品中随机抽取5个奖品,类别“后幸运值达到一定值”实现获得稀有水晶的奖励。2.ChainofResponsibilityMode责任链模式理解:高度概括:让多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连接成一个链,并遵循这个的请求沿着链传递,直到一个对象处理它。在设计Java模式时,可能需要设计许多对象来满足用户请求。责任链模式是一种成熟的模式,它使用多个对象来处理用户请求。责任链模式的关键是将用户请求分配给许多对象。这些对象被组织成责任链,即每个对象都包含对后续对象的引用,并且需要责任链上的每个对象,如果它能处理用户的请求,它就会处理它,不再将用户的请求传递给责任链上的下一个对象。如果它不能处理用户的请求,它必须将用户的请求传递给责任链中的下一个对象。责任链模式结构中的两个角色:_Processor_:是一个接口,负责指定具体处理器处理用户请求的方法和具体处理器设置后续对象的方法;_特定处理器_:特定处理器是实现Handler接口的类的实例。具体的处理器通过调用处理器接口中指定的方法来处理用户的请求,即处理器接收到用户的请求后,会调用接口中指定的方法。方法执行过程中,如果发现可以处理用户的请求,则处理相关数据;否则,将无法处理的信息反馈给用户,然后将用户的请求传递给它的后继对象。责任链模式的UML类图:责任链模式的优缺点:优点:①责任链中的对象只与其继承者低耦合,与其他对象无关;②在处理者之间分配职责时,责任链赋予应用更大的灵活性;③应用程序可以动态添加、删除处理器或重新分配处理器职责;④应用程序可以动态改变处理器的顺序;⑤使用责任链的用户不需要知道处理者的信息,用户也不会知道是哪个对象处理了他的请求;缺点:①不能保证请求一定被接收:没有明确的接收者,不能保证一定被处理;②责任链过长,影响系统性能。不正确的链接构建可能会导致无限循环。责任链模式的适用场景:①可以处理用户请求的对象很多,希望程序在运行时自动确定处理用户的对象;②希望用户不需要显式指定接收者,向多个接收者之一提交请求;③程序希望动态地制定一个能够处理用户请求的对象集合。3.王者荣耀角度责任链模式实现结构图及代码UML类图Eclipse结构图主要功能【应用】Application.javapackageangle_responsibility;/**测试应用类*/importangle_responsibility。应用程序;导入angle_responsibility.Diamond60DrawAPrize;导入angle_responsibility.Handler;导入angle_responsibility.Diamond270DrawFivePrizes;导入angle_responsibility.RareCrystalOfKings;公共类应用程序{私有处理程序diamond60,diamond270,rareDiamond;//责任链上的对比publicvoidcreateChain(){//建立责任链diamond60=newDiamond60DrawAPrize();diamond270=newDiamond270DrawFivePrizes();rareDiamond=newRareCrystalOfKings();diamond60.setNextHandler(diamond270);diamond270.setNextHandler(rareDiamond);}publicvoidreponseClient(intnumber){//响应用户requestdiamond60.handleRequest(number);}publicstaticvoidmain(Stringargs[]){Applicationapplication=newApplication();应用程序.createChain();系统输出.println("当点击"60Diamonds"绘制一次时:");System.out.print([购买成功]");application.reponseClient(60);System.out.println("---------------------------");System.out.println("当点击"270颗钻石"绘制五次时:");系统输出。print("[购买成功]");application.reponseClient(270);System.out.println("--------------------------");System.out.println("当钻石抽奖"幸运值达到201"时:");System.out.print([购买成功]");application.reponseClient(201);}}Processor(Handler)Handler.javapackageangle_responsibility;/**作用一:Handler:是一个接口,负责指定具体的handler处理用户请求的方法和具体的handler设置后继的方法对象*/导入angle_responsibility.Handler;publicinterfaceHandler{publicabstractvoidhandleRequest(intnumber);//具体处理用户请求1次抽取60钻或5次抽取270钻publicabstractvoidsetNextHandler(Handlerhandler);}具体处理程序(ConcreteHandler)Diamond60DrawAPrize.javapackageangle_responsibility;/**作用2.1:具体处理器:具体processor是实现了processor接口的类的实例*具体的processor通过调用processor接口中指定的方法来处理用户的请求*即processor接收到用户的请求后,会调用接口指定的方法,在执行这个方法的过程中*如果发现可以处理用户的请求,则处理相关数据*否则,将无法处理的信息反馈给用户,然后将用户的请求传递给用户到它的后继对象*/importangle_responsibility.Handler;公共类Diamond60DrawAPrize实现Handler{privateHandlerhandler;//存放当前处理者后续的Hander接口变化publicvoidhandleRequest(intnumber){if(number==60){//60钻石抽一次Stringrandom=””;String[]doc={"白起","夏侯惇","甄姬","金币288","小喇叭5","铭文碎片1600","铭文碎片400","铭文碎片100",《铭文碎片25》,《爱情气球(3天)》,《亲密度玫瑰》,《钻石48》,《龙域领主经验卡》};intindex=(int)(Math.random()*doc.length);//随机选择其中一个输出random=doc[index];System.out.println(随机);}elsehandler.handleRequest(number);//将请求传递给下一个处理程序}extHandlerpublicHandlerandvoid{this.handler=handler;}}Diamond270DrawFivePrizes,javapackageangle_responsibility;/**作用2.2:具体的handler:具体的handler是实现了handler接口的类的实例*具体的handler调用handler接口指定的方法来处理用户的请求*即处理器接收到用户的请求后,会调用接口中指定的方法,在方法执行过程中*如果发现可以处理用户的请求,则处理相关数据*否则,会将无法处理的信息反馈给用户,然后将用户的请求传递给它的后继对象*/publicclassDiamond270DrawFivePrizesimplementsHandler{privateHandlerhandler;//存放当前handler后继者的Hander接口变量publicvoidhandleRequest(intnumber){if(number==270){//270Diamonddraw5次Stringrandom,random1,random2,random3,random4="";String[]doc={"白起","夏侯惇","甄姬","金币288","小喇叭5","铭文碎片1600","铭文碎片400","铭文碎片100",《铭文碎片25》,《恋爱气球(3天)》,《贴心玫瑰》,《钻石48》,《龙王经验卡》};intindex=(int)(Math.random()*doc.length);//随机选择五个输出random=doc[index];System.out.print(随机+",");intindex1=(int)(Math.random()*doc.length);random1=doc[index1];System.out.print(random1+",");intindex2=(int)(Math.random()*doc.length);random2=doc[index2];System.out.print(random2+",");输入dex3=(int)(Math.random()*doc.length);random3=doc[index3];System.out.print(random3+",");intindex4=(int)(Math.random()*doc.length);Random4=DOC[Index4];System.out.println(Random4);}Elsehandler.handlerequest(number);//将请求传递给下一个处理器}PublicVoidSetnexTHandler(HandlerHandl.handler=handler;}}RareCrystalOfKings.javapackageangle_responsibility;/**作用2.3:具体处理程序:具体处理程序是实现处理程序的类的实例interface*具体的handler通过调用handler接口指定的方法来处理用户的请求*处理器接收到用户的请求后,会调用接口指定的方法。在方法执行过程中*如果发现用户的请求可以被处理,相关数据才会被处理*否则,它会将无法处理的信息反馈给用户,然后将用户的请求传递给它的后继对象*/publicclassRareCrystalOfKingsimplementsHandler{privateHandlerhandler;//存储Hander当前handler后继者的接口变量publicvoidhandleRequest(intnumber){if(number==201){//当幸运值达到201时,会产生稀有水晶System.out.println("[Rare]国王水晶");}否则处理er.handleRequest(number);//将请求传递给下一个处理程序}publicvoidsetNextHandler(Handlerhandler){this.handler=handler;}}运行结果截图_因为奖品是随机的,多拍几张图片作为测试_第一次抽奖:第二次抽奖:...第N次抽奖:
