前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在王者荣耀角度下分析面向对象程序设计B中23种设计模式之状态模式

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

作者头像
荣仔_最靓的仔
发布2021-02-02 17:32:49
4600
发布2021-02-02 17:32:49
举报

·

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

·

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

一、简述

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ·
  • 状态模式在王者荣耀中的应用
  • ·
  • 一、简述
  • 二、状态模式(State Pattern)
  • 三、王者荣耀角度下实现状态模式结构图及代码
  • 应用一实例实现
  • 应用二实例实现
  • 欢迎留言,一起学习交流~
  • END
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档