从王者荣耀看设计模式(策略模式)
设计模式分类
创建型模式关注对象的创建过程,结构型模式关注对象与类的组织,而行为型模式关注对象之间的交互
对GoF23种设计模式的说明
一:简介
游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击
二:策略模式
策略模式将可变的部分从程序中抽象出来分离成算法接口,在该接口下分别封装一系列算法实现
模式动机
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在本实例中,将各种技能分别封装成各类具体策略,玩家可以根据英雄的攻击方式或者技能属性选择不同的具体技能策略
- 这其中的设计原则有:
- 找出应用中需要变化的部分,把他们独立出来做成算法接口。(把英雄的召唤师技能做成了算法接口)
- 面向接口编程,而不是面向实现。(我们在使用召唤师技能策略接口时,并不知道它以后还会有什么样的召唤师技能)
- 多用组合,少用继承(一个完整的英雄,是用具体的接口对象组合而成的,或者说各种接口小对象组合成了一个英雄对象)
- 策略模式的优点
- 使用组合,而不单单是继承,使得架构更灵活。
- 富有弹性,可以较好的应对未来的变化。(开-闭原则)
- 更好的代码复用性。(相对于继承)
- 策略模式的缺点
- 增加了对象的数目(每个接口都做成了一个对象,对象数目增多)
三:类图
四:代码实现
接口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();
}
}