從王者榮耀看設計模式(策略模式)
設計模式分類
創建型模式關注對象的創建過程,結構型模式關注對象與類的組織,而行為型模式關注對象之間的交互
對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();
}
}