在王者荣耀角度下分析面向对象程序设计B中23种设计模式之状态模式

2021-02-02 17:32:49 浏览数 (1)

·

状态模式在王者荣耀中的应用

·

应用一:镜一二技能触发技能效果状态变化

应用二:瑶三技能附身队友移动状态的变化

一、简述

状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

应用一: 王者荣耀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());
    }  
} 

运行结果截图

更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏

欢迎留言,一起学习交流~

感谢阅读

END

0 人点赞