·
状态模式在王者荣耀中的应用
·
应用一:镜一二技能触发技能效果状态变化
应用二:瑶三技能附身队友移动状态的变化
一、简述
状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
应用一: 王者荣耀s19赛季新英雄镜被策划称作史上最难的最花里胡哨的英雄,在她上线后,玩家们也纷纷投身于体验镜这一英雄的热潮中。那么对于王者荣耀新英雄镜技能,研究起来也是别有一番风趣的。简单来说,镜通过一技能——开锋,可以快速向前突进,当触碰到野怪、小兵、敌人时,可突进两段,相反则突进一段;通过二技能——裂空,触碰到野怪小兵等会恢复血量,触碰到的越多、装备越好,回血能力越强,同一技能,若未触碰到目标则不产生回血效果。因此,镜的一二技能触发的技能效果状态是随是否触碰到目标而改变的。
应用二: 王者荣耀辅助英雄瑶,可利用三技能——独立兮山之上,附身到其他英雄,赋予附灵目标真实护盾(抵挡真实伤害),附身状态技能获得增强并且刷新所有技能冷却。鹿灵开大的话就是减速范围敌人,没有伤害控制效果,鹿灵正常持续6秒,也可以点一技能直接解除。简单来讲,瑶通过三技能,可随队友一起移动(移动状态随外部环境变化而变化)。
二、状态模式(State Pattern)
状态模式理解: 高度概括:允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎修改了它的类。 状态模式又称状态对象模式,状态模式是对象的行为模式。 一个对象的状态,依赖于它的变量的取值情况,对象在不同的运行环境中,可能具有不同的状态,在许多情况下,对象调用方法所产生的行为效果依赖于它当时的状态。 状态模式的关键是将对象的状态封装成为独立的类对象,调用方法时,可以委托当前对象所具有的状态,调用相应的方法,使当前对象看起来好像修改了它的类。
状态模式结构中的三种角色: ①环境(Context):环境是一个类,该类含有抽象状态(State)声明的变量,可以引用任何具体状态类的实例。用户对该环境(Context)类的实例,在某种状态下的行为感兴趣; ②抽象状态(State):抽象状态是一个接口或抽象类,抽象状态中定义了与环境(Context)的一个特定状态相关的若干个方法; ③具体状态(Concrete State):具体状态是实现(扩展)抽象状态(抽象类)的类。
状态模式的UML类图:
状态模式的优缺点: 优点: ①使用一个类封装对象的一种状态,很容易增加新的状态; ②在状态模式中,环境(Context)中不必出现大量的条件判断语句。环境(Context)实例所呈现的状态变得更加清晰、容易理解; ③使用状态模式可以让用户程序很方便的切换环境(Context)实例的状态; ④使用状态模式不会让环境(Context)的实例中出现内部状态不一致的情况; ⑤当状态对象没有实例变量时,环境(Context)的各个实例可以共享一个状态对象; 缺点: 增加新的状态时会增加状态类,而且在增加新的状态类之后,环境类需要做相应的修改,不太符合开—闭原则。
状态模式的适用情景: ①一个对象的行为依赖于它的状态,并且他必须在运行时根据状态改变它的行为; ②需要编写大量的条件分支语句来决定一个操作的行为,而且这些条件恰好表示对象的一种状态。
状态模式设计原则: ①状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类; ②状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
三、王者荣耀角度下实现状态模式结构图及代码
应用一实例实现
eclipse结构图
主函数【应用(Application)】 Applicayion.java
代码语言:javascript复制package angle_statePattern1;
import angle_statePattern1.SkillState;
import angle_statePattern1.SkillOneHitTarget;
import angle_statePattern1.SkillTwoHitTarget;
import angle_statePattern1.SkillTwoNotHitTarget;
import angle_statePattern1.SkillOneNotHitTarget;
import angle_statePattern1.HeroJing;
public class Application{
public static void main(String args[]) {
System.out.println("");
System.out.println("S19赛季新英雄【镜】部分技能释放效果:");
System.out.println("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
SkillState state=new SkillOneHitTarget(11);
HeroJing hero=new HeroJing();
hero.setState(state);
hero.showMessage();
state=new SkillOneNotHitTarget(10);
hero=new HeroJing();
hero.setState(state);
hero.showMessage();
state=new SkillTwoHitTarget(21);
hero.setState(state);
hero.showMessage();
state=new SkillTwoNotHitTarget(20);
hero.setState(state);
hero.showMessage();
}
}
环境角色 HeroJing.java
代码语言:javascript复制package angle_statePattern1;
import angle_statePattern1.SkillState;
public class HeroJing{
SkillState state;
public void showMessage(){
System.out.println("");
state.showState();
System.out.println("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
}
public void setState(SkillState state){
this.state=state;
}
}
抽象状态 SkillState.java
代码语言:javascript复制package angle_statePattern1;
public interface SkillState{
public void showState();
}
具体状态 SkillOneHitTarget.java
代码语言:javascript复制package angle_statePattern1;
import angle_statePattern1.SkillState;
public class SkillOneHitTarget implements SkillState{
int n;
SkillOneHitTarget(int n){
if(n==11)
this.n=n;
}
public void showState(){
System.out.println("【一技能】触碰到了目标,触发两段位移");
}
}
SkillTwoHitTarget.java
代码语言:javascript复制package angle_statePattern1;
import angle_statePattern1.SkillState;
public class SkillTwoHitTarget implements SkillState{
int n;
SkillTwoHitTarget(int n){
if(n==21)
this.n=n;
}
public void showState(){
System.out.println("【二技能】触碰到了目标,有回血效果");
}
}
SkillOneNotHitTarget.java
代码语言:javascript复制package angle_statePattern1;
import angle_statePattern1.SkillState;
public class SkillOneNotHitTarget implements SkillState{
int n;
SkillOneNotHitTarget(int n){
if(n==10)
this.n=n;
}
public void showState(){
System.out.println("【一技能】空放,只有一段位移");
}
}
SkillTwoNotHitTarget.java
代码语言:javascript复制package angle_statePattern1;
import angle_statePattern1.SkillState;
public class SkillTwoNotHitTarget implements SkillState{
int n;
SkillTwoNotHitTarget(int n){
if(n==20)
this.n=n;
}
public void showState(){
System.out.println("【二技能】空放,无回血效果");
}
}
运行结果截图
应用二实例实现
eclipse结构图
主函数【应用(Application)】 Applicayion.java
代码语言:javascript复制package angle_statePattern2;
import angle_statePattern2.Hero;
public class Application{
public static void main(String args[]) {
System.out.println("【英雄“瑶”释放三技能可以附身到其他英雄身上,跟随其他英雄的移动而移动】");
System.out.println("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
Hero heroOne=new Hero("野王");
Hero heroTwo=new Hero("瑶宝宝");
heroOne.startUp();
heroTwo.stop();
System.out.println("★★★★★★★★★★★★★★★★★★★★★★★");
heroOne.stop();
heroTwo.startUp();
}
}
环境 Hero.java
代码语言:javascript复制package angle_statePattern2;
import angle_statePattern2.State;
import angle_statePattern2.HeroMoveState;
import angle_statePattern2.HeroRestState;
public class Hero{
static State moveState,restState;
static State state;
String name;
Hero(String name){
this.name=name;
moveState=new HeroMoveState();
restState=new HeroRestState();
state=restState;
}
public void startUp(){
state.startUp(this);
}
public void stop(){
state.stop(this);
}
public void setState(State state){
this.state=state;
}
public State getMoveState(){
return moveState;
}
public State getRestState(){
return restState;
}
public String getName(){
return name;
}
}
抽象状态 State.java
代码语言:javascript复制package angle_statePattern2;
import angle_statePattern2.Hero;
public abstract class State{
public abstract void startUp(Hero hero);
public abstract void stop(Hero hero);
}
具体状态 HeroMoveState.java
代码语言:javascript复制package angle_statePattern2;
import angle_statePattern2.State;
import angle_statePattern2.Hero;
public class HeroMoveState extends State{
public void startUp(Hero hero){
System.out.println(" " hero.getName() "也跟随野王赶向龙坑处支援");
hero.setState(hero.getRestState());
}
public void stop(Hero hero){
System.out.println(" " hero.getName() "也在蓝BUFF处辅助野王打蓝");
hero.setState(hero.getRestState());
}
}
HeroRestState.java
代码语言:javascript复制package angle_statePattern2;
import angle_statePattern2.State;
import angle_statePattern2.Hero;
public class HeroRestState extends State{
public void startUp(Hero hero){
System.out.println("☆蓝BUFF刷新了!");
System.out.println(" " hero.getName() "在蓝BUFF处打蓝");
hero.setState(hero.getMoveState());
}
public void stop(Hero hero){
System.out.println("☆龙坑处爆发团战!");
System.out.println(" " hero.getName() "赶向龙坑处支援");
hero.setState(hero.getMoveState());
}
}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏。
欢迎留言,一起学习交流~
感谢阅读