物件導向設計模式-策略模式(Strategy Pattern)

此篇介紹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-深入淺出 設計模式。