从王者荣耀看设计模式(状态模式)

一.简介

英雄项羽在敌方英雄的攻击下存在3种不同的状态。
1.在健康生命值下——普通状态,在每次被攻击时,当前生命值=剩余生命值-敌方英雄伤害值
2.在生命值低于某一特定的值——被动状态,在每次被攻击时,当前生命值=剩余生命值-敌方英雄伤害值/2
3.英雄项羽生命值低于0——死亡状态

二.状态模式

状态模式:又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式,状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像 是改变了它的类一样

  • 这其中的设计原则有:
  1. 状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。
  2. 状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变
  3. 状态模式所涉及到的角色有:

    环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
    抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
    具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

  • 状态模式的优点:
  1. 面向接口式编程,将实现细节巧妙封装在各个不同的状态类中,状态转换交给状态类自己去实现,外部无需关心;
  2. 将由大量业务、大量逻辑判断的代码去除,状态类内部通过状态的转换实现相关逻辑,代码可读性更好;
  • 组合模式模式的缺点
  1. 增加新的状态时会增加状态类,而且在增加新的状态类之后,环境类需要做相应的修改,不太符合开闭原则

三.结构图

四.设计类图

五.代码实现

LifeState类(抽象状态类)

package com.game.LifeState;
import com.game.LifeManager.LifeManager;
/** 英雄项羽的游戏状态接口* @param life 当前生命值* @param lifeManager 状态上下文,用来在实现状态对应的功能处理的时候,可以回调上下文的数据*/public interface LifeState {//英雄项羽被攻击的状态public abstract void beAttacted(int life, LifeManager lifeManager);
}

NormalBeAttackedState类(具体状态类)——正常生命值状态

package com.game.LifeState.impl;import com.game.LifeManager.LifeManager;
import com.game.LifeState.LifeState;
/** 英雄项羽在健康生命值下被攻击的状态*/public class NormalBeAttackedState implements LifeState {public void beAttacted(int life, LifeManager lifeManager) {//当前生命值=之前生命值-敌方英雄的攻击力int newLife=lifeManager.getLife()-lifeManager.getHeroHurt();System.out.print("英雄项羽正受到"+lifeManager.heroHurt+"点伤害,");System.out.println("当前生命值为"+newLife);//设置当前生命值lifeManager.setLife(newLife);}
}

AttactedUnderPassiveState类(具体状态类)——被动状态下

package com.game.LifeState.impl;import com.game.LifeManager.LifeManager;
import com.game.LifeState.LifeState;
/** 当项羽生命值小于500,激发被动状态,所受伤害减半*/public class AttactedUnderPassiveState implements LifeState {public void beAttacted(int life, LifeManager lifeManager) {//设置在被动下项羽所受伤害值int newHeroHurt=lifeManager.getHeroHurt()/2;//设置被动状态下遭受攻击后当前血量int newLife=lifeManager.getLife()-newHeroHurt;//判断:在被动状态下如果生命值低于0,英雄死亡if(newLife>0) {System.out.println("英雄项羽激发被动陷阵之志,所受伤害减半");System.out.print("英雄项羽正受到"+newHeroHurt+"点受害,");System.out.println("当前的生命值为:"+newLife);lifeManager.setLife(newLife);}else {System.out.println("英雄项羽已经死亡");}}}

dieState类(具体状态类)——死亡状态

package com.game.LifeState.impl;import com.game.LifeManager.LifeManager;
import com.game.LifeState.LifeState;
/** 英雄死亡状态*/public class dieState implements LifeState {public void beAttacted(int life, LifeManager lifeManager) {System.out.println("英雄项羽已经死亡");}}

LifeManager类(环境类)

package com.game.LifeManager;import com.game.LifeState.LifeState;
import com.game.LifeState.impl.AttactedUnderPassiveState;
import com.game.LifeState.impl.NormalBeAttackedState;
import com.game.LifeState.impl.dieState;/** 环境类*/public class LifeManager {//持有状体处理对象private LifeState state = null;//项羽的初始生命值private int life=1000;//项羽收到敌方攻击的伤害值public int heroHurt=0;//构造方法初始化伤害值public LifeManager(int heroHurt) {this.heroHurt=heroHurt;}//get,setpublic int getLife() {return life;}public void setLife(int life) {this.life = life;}public int getHeroHurt() {return heroHurt;}public void setHeroHurt(int heroHurt) {this.heroHurt = heroHurt;}public void beAttacked() {if(life>500) {state=new NormalBeAttackedState();}else if(life>0 && life<=500) {state=new AttactedUnderPassiveState();}else if(life<=0) {state=new dieState();}//转调状态对象执行相应操作state.beAttacted(life, this);}
}

LifeManagerTest类(测试类)

package com.game.test;import com.game.LifeManager.LifeManager;
/** 测试类*/public class LifeManagerTest {public static void main(String [] args) {//设置项羽受到每次126的伤害LifeManager lm=new LifeManager(126);//设置项羽被相应伤害值攻击的次数for(int i=0;i<15;i++) {lm.beAttacked();}}
}

运行结果

转载于:https://www.cnblogs.com/miaowulj/p/11458635.html

从王者荣耀看设计模式(六.状态模式)相关推荐

  1. 从王者荣耀看设计模式(二十二.备忘录模式)

    从王者荣耀看设计模式 一.简介 点击王者荣耀商店法术的装备栏,存在有"贤者的庇护"这一装备.在对战中,当玩家处于死亡状态时,会触发此装备的效果,能够让英雄重新复活. ┬┴┬┌─ ● ...

  2. 从王者荣耀看设计模式(远程代理模式)

    从王者荣耀看设计模式(远程代理模式) 一.简介 每位王者荣耀玩家都有一个属于自己的游戏账号.为了提升游戏等级或者增加游戏体验感,会存在多个游戏玩家同时共享一个游戏账号的情况.当一位玩家使用账号正在游戏 ...

  3. 从王者荣耀看设计模式(十.外观模式)

    ##从王者荣耀看设计模式(外观模式) 一.简介 王者荣耀是由多人协同开发而成,每个人负责游戏的一个或多个子功能,一个完整的功能是由很多已开发的子功能组合成的.我们要玩游戏时,只需要打开王者荣耀APP, ...

  4. 从王者荣耀看设计模式(虚拟代理模式)

    从王者荣耀看设计模式(虚拟代理模式) 一.简介 王者荣耀游戏设置了很多种游戏模式,比如:王者模拟战.无限乱斗.梦境大乱斗.火焰山大战等.当从王者荣耀的主界面进入各类模式的界面时,由于网络原因,会存在一 ...

  5. 从王者荣耀看设计模式(十七.桥接模式)

    从王者荣耀看设计模式(桥接模式) 一.简介 王者荣耀是一款RGB游戏,玩家操控自己选择的英雄进行竞赛.在游戏正式开始前,玩家在挑选想要操作的英雄的同时,也会挑选适合该英雄的召唤师技能.召唤师技能是通用 ...

  6. 从王者荣耀看设计模式(五.组合模式)

    从王者荣耀看设计模式(组合模式) 一.简介 在王者荣耀这款游戏中,我们可以在商店中购买英雄.英雄由法师.射手.打野等职业组合而成,其中各个职业由中国元素的英雄和外国元素的英雄组成,玩家可根据需要挑选并 ...

  7. 从王者荣耀看设计模式(一.策略模式)

    从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...

  8. 从王者荣耀看设计模式(六.观察者模式)

    从王者荣耀看设计模式(观察者模式) 一.简介: 王者荣耀是由十位玩家组成的RGB类电子竞技游戏.为了游戏良好的体验感,王者荣耀具有完备的系统提示机制.游戏开始时,系统会发出提示音:"敌军还有 ...

  9. 从王者荣耀看设计模式(保护代理模式)

    从王者荣耀看设计模式(保护模式) 一.简介 打开王者荣耀,点击右上角头像标志可进入我的信息主页.在我的个人主页中,我可以可设置玩家的游戏昵称,性别,常用英雄.除此之外,我还可以查看自己得到别人点赞的次 ...

最新文章

  1. mysql通过参数文件启动_mysql启动的时参数文件中的[mysql]下的参数没有生效
  2. linux 怎样设置ip、网关、掩码
  3. Redis集群研究和实践(基于redis 3.0.5)
  4. 分布式集群环境下,如何实现session共享三(环境搭建)
  5. javaweb可部署目录结构
  6. matlab kfda,SVD与KFDA相结合人脸识别-matlab-毕业论文
  7. DM工作笔记-dimp及dexp的使用及解决该工具不能解析此文件,请使用更高版本的工具
  8. NETSTAT 指令详解
  9. HALCON 20.11:深度学习笔记(4)--- 网络和训练过程
  10. LAMP平台部署及应用(二) 安装Discuz!论坛系统
  11. VMware Workstation 的 MacOS 解锁补丁 Unlocker 3.0.4
  12. 单片机超声波测距模块原理与源码解析
  13. 老男孩python作业_老男孩python学习之作业一购物小程序
  14. git diffmerge合并
  15. mysql lob 操作_Oracle中LOB 处理
  16. win激活时错误0xc0000022
  17. MOSFET管应用总结
  18. GDUT - 专题学习3 G - 食物链
  19. 进程注入之DLL注入
  20. net start命令的使用

热门文章

  1. python在哪个方向岗位最多_Python就业方向这么多,哪些岗位最有发展?
  2. android沉浸模式代码,Android沉浸式的两种方法
  3. python随机生成中文句子_python – 如何使用NLTK从诱导语法中生成句子?
  4. java构造器 权限_一文搞懂Java的 构造方法 和 访问权限
  5. 微信小程序 css边框阴影,微信小程序|CSS的内边距和圆框
  6. oracle中没有修改权限,oracle 修改listener.ora 没有权限怎么办
  7. python字典_Python字典
  8. junit断言_JUnit断言
  9. jsp taglib指令_JSP指令–页面,包含和taglib示例
  10. python gc_Python垃圾收集(Python GC)