此篇介紹OOP Design Pattern-策略模式(Strategy Pattern)。
JC學習部落格紀錄-物件導向設計模式-Design Pattern,目的減少專案code reuse以及可讀性,方便之後能快速維護,不要佔用太多了時間,因此寫了這篇物件導向設計模式,一邊實作一邊紀錄留下足跡。
設計模式-策略模式(Strategy Pattern)
將多個類似演算法各別封裝,並且能相互替換。
情境:我們要設一個遊戲,其中的職業有:騎士、國王、刺客,武器有空拳、斧頭、匕首、劍,當角色剛重生武器預設空拳,玩家可自由進行武器更換進行攻擊,而職業只要選擇了就不能更換,如何撰寫才能符合條件呢,如看不懂範例可參考物件導向設計基本觀念。
public abstract class Caracter
{
//武器初始化為空拳
private IWeaponBehavior _WeaponBehavior = new punch();
protected string Job = "";
//進行攻擊
public string fight()
{
return Job + _WeaponBehavior.useWeapon();
}
//武器可由玩家自行更換
public void setWeapon(IWeaponBehavior wb)
{
this._WeaponBehavior = wb;
}
}
public class Knight : Caracter
{
public Knight()
{
Job = "騎士";
}
}
public class King : Caracter
{
public King()
{
Job = "國王";
}
}
public class Bravo : Caracter
{
public Bravo()
{
Job = "刺客";
}
}
//武器interface
public interface IWeaponBehavior
{
string useWeapon();
}
public class punch : IWeaponBehavior
{
public string useWeapon()
{
return "使用空拳攻擊";
}
}
public class Knife : IWeaponBehavior
{
public string useWeapon()
{
return "使用匕首攻擊";
}
}
public class Axe : IWeaponBehavior
{
public string useWeapon()
{
return "使用斧頭攻擊";
}
}
public class Sword : IWeaponBehavior
{
public string useWeapon()
{
return "使用劍攻擊";
}
}
實作:
private static void Main(string[] args)
{
//騎士
Caracter one = new King();
Console.WriteLine(one.fight());
one.setWeapon(new Axe());
Console.WriteLine(one.fight());
one.setWeapon(new Knife());
Console.WriteLine(one.fight());
//國王
Caracter two = new Knight();
Console.WriteLine(two.fight());
two.setWeapon(new Knife());
Console.WriteLine(two.fight());
//刺客
Caracter three = new Bravo();
Console.WriteLine(three.fight());
three.setWeapon(new Sword());
Console.WriteLine(three.fight());
Console.Read();
}
結果 :
總結:
將相似功能的物件抽象化,要對介面寫程式,之後要新增角色職業或武器種類更將快速方便。
有任何問題可在下方留言讓我知道。
謝謝
下一篇觀察者模式-Observer Pattern
參考資料
書籍:Head First Design Patterns-深入淺出 設計模式。