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

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

图片1

一:简介

游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击

二:策略模式

策略模式将可变的部分从程序中抽象出来分离成算法接口,在该接口下分别封装一系列算法实现

  • 这其中的设计原则有:
  1. 找出应用中需要变化的部分,把他们独立出来做成算法接口。(把英雄的召唤师技能做成了算法接口)
  2. 面向接口编程,而不是面向实现。(我们在使用召唤师技能策略接口时,并不知道它以后还会有什么样的召唤师技能)
  3. 多用组合,少用继承(一个完整的英雄,是用具体的接口对象组合而成的,或者说各种接口小对象组合成了一个英雄对象)
  • 策略模式的优点
  1. 使用组合,而不单单是继承,使得架构更灵活。
  2. 富有弹性,可以较好的应对未来的变化。(开-闭原则)
  3. 更好的代码复用性。(相对于继承)
  • 策略模式的缺点
  1. 增加了对象的数目(每个接口都做成了一个对象,对象数目增多)
三:类图

1597476-20190831101252334-2035485078.png

四:代码实现

1597476-20190827111010592-695703968.png

接口ISkill

package com.game.Skill;
/*
 * 英雄的召唤师技能接口
 */
public interface ISkill {
    /*
     * 使用召唤师技能的方法
     */
    public abstract void useSkill();
}

类JiPa0实现ISkill接口

package com.game.Skill.impl;
import com.game.Skill.ISkill;
 /*
  * 召唤师技能(疾跑)
  */
public class JiPao implements ISkill {
    public void useSkill() {
        System.out.println("疾跑,75秒CD,增加30%移动速度持续10秒");
       }
}

类KuangBao实现ISkill接口

package com.game.Skill.impl;
import com.game.Skill.ISkill;
/*
 * 召唤师的技能(狂暴)
 */
public class KuangBao implements ISkill {
    @Override
    public void useSkill() {
        System.out.println("狂暴:60秒CD,增加攻击速度60%持续5秒");
    }
}

类Hero(体现面对接口思想,需传入一个技能接口对象)

package com.game.domain;
import com.game.Skill.ISkill;
/*
 * 英雄类(抽象类)
 */
public abstract class Hero {
    //英雄的名称
    private String heroName;
    //英雄的召唤师技能的接口(组合关系,需要使用时传入一个具体的技能对象)
    private ISkill iskill;  
    //英雄的自我介绍的方法
    public abstract void display(); 
    //加入一个新的成员(英雄单次攻击的伤害值)
    private int heroHurt;   
    //英雄的普通攻击的方法
    public abstract void normalAttack();    
    //英雄的召唤师技能的使用方法
    public void skill() {
        iskill.useSkill();
    }   
    //set/get
    public String getHeroName() {
        return heroName;
    }
    public void setHeroName(String heroName) {
        this.heroName = heroName;
    }
    public void setIskill(ISkill iskill) {
        this.iskill = iskill;
    }
    public int getHeroHurt() {
        return heroHurt;
    }
    public void setHeroHurt(int heroHurt) {
        this.heroHurt = heroHurt;
    }
}

类HouYi继承Hero类

package com.game.domain;
/*
 * 英雄后羿类
 */
public class HouYi extends Hero {
    //编写构造方法
    public HouYi() {
        super.setHeroName("后羿");
    }
    //后羿英雄的自我介绍
    public void display() {
        System.out.println("觉醒吧,猎杀时刻!");

    }
    //后羿英雄的普通攻击
    public void normalAttack() {
        System.out.println("xiuxiu~ 被动:迟缓之箭");
    }
}

测试类HeroTest

package com.game.test;

import com.game.Skill.impl.JiPao;
import com.game.Skill.impl.KuangBao;
import com.game.domain.Hero;
import com.game.domain.HouYi;
/*
 * 英雄与技能的测试类
 */
public class HeroTest {
    public static void main(String[] args) {
        //1.选择英雄
        Hero hero = new HouYi();
        //2.英雄自我介绍
        System.out.println("英雄:"+hero.getHeroName()+",自我介绍:");
        hero.display();
        //3.玩家根据组队情况,设置英雄的召唤师技能
        hero.setIskill(new JiPao());//面向接口编程的体现
        hero.setIskill(new KuangBao());
        //4.游戏开始
        System.out.println("游戏开始,请做好准备!");
        
        //5.使用英雄的普通攻击
        hero.normalAttack();
        
        //6.使用英雄的召唤师技能攻击
        hero.skill();
    }
}
五:运行结果

1597476-20190827102642713-1923318840.png

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值