天天看點

淺談設計模式01-政策模式

一、 定義

最近開始研讀Head First設計模式,這本書給人的感覺耳目一新,不容易犯困啊。今天和大家分享一下政策模式。

1. 定義:

政策模式定義了算法族,分别封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用該算法的客戶。

<a href="http://images.cnblogs.com/cnblogs_com/janes/201103/201103211616484750.jpg"></a>

上圖為政策模式結構圖,其中:

Strategy可以聲明為接口或者抽象類,主要用來抽象不同的算法或行為;

ConcreteStrategyA等是上述接口或抽象類的具體實作,分别實作不同的算法或者行為;

Context中包含Strategy的執行個體,以及對該執行個體的操作。

2. 設計模式原則:

多用組合,少用繼承。

找出應用中可能變化之處,把它們獨立出來,不要和那些不需要變化的代碼放在一起。

二、 執行個體

看到這個模式,讓我想起西遊記裡面神仙妖怪,每每大戰都會使用各自的神器,大顯神通。正因為這樣,才能成為流傳的經典。要是都千篇一律赤手空搏,恐怕也就沒什麼好看的了。下面我們就以這個寫個簡單的小例子。

1.場景一: 簡單亮相

各路神仙首先要來個自我介紹,采用類似“我乃…”句式;然後亮出神器,“看我的…”。

實作:我們使用一個抽象類Role,包含Introduce()和Fight()方法。然後定義幾個具體的類來實作。

抽象角色類

public abstract class Role

{

public abstract void Introduce();

public abstract void Fight();

}

具體角色類

/// 孫悟空

public class SunWukong : Role

public override void Introduce()

Console.WriteLine("我乃齊天大聖孫悟空!");

public override void Fight()

Console.WriteLine("看我的如意金箍棒!");

/// 鐵扇公主

public class TieshanGongzhu : Role

Console.WriteLine("我乃鐵扇公主!");

Console.WriteLine("看我一扇,讓你飛到天邊!");

Program.cs調用

class Program

static void Main(string[] args)

Console.WriteLine("簡單亮相:");

//悟空

SunWukong wukong = new SunWukong();

wukong.Introduce();

wukong.Fight();

//鐵扇公主

TieshanGongzhu gongzhu = new TieshanGongzhu();

gongzhu.Introduce();

gongzhu.Fight();

Console.Read();

2. 場景二:悟空搶了鐵扇公主的武器

上面我們實作了不同神仙使用不同的武器進行打鬥,但是有可能發生這種情況,比方孫悟空搶了鐵扇公子的扇子,或者某路妖怪大哥稍占上風搶走了悟空的金箍棒。這個時候用原來這種方式就不好實作了。是以我們将fight這個行為抽象為接口,使它與具體的主人分離獨立開來。

IFight接口中定義fight()方法,然後在各具體行為類中實作。

/// 抽象出來的戰鬥接口

public interface IFight

void fight();

/// 金箍棒武器戰鬥

public class JinGuBang : IFight

public void fight()

//鐵扇武器戰鬥

public class TieShan : IFight

  //空手戰鬥

    public class Kongshou : IFight

    {

        public void fight()

        {

            Console.WriteLine("完了!我沒有武器了。");

        }

    }

抽象角色類Role:其中包含IFight行為執行個體;改變武器的方法;以及調用fight()的方法。

public abstract class Role

public IFight fight;//IFight接口的執行個體

public void SetFight(IFight fight)//改變武器

this.fight = fight;

public void Fight()//調用fight()方法

fight.fight();

 //搶武器

        public void GetWeaponFrom(Role role)

            this.fight = role.fight;

            role.fight = new Kongshou();

具體角色類。其中,在構造函數中初始化戰鬥武器。

public SunWukong()

{//初始化武器

base.fight = new JinGuBang();

public TieshanGongzhu()

base.fight = new TieShan();

Program.cs類調用:

Console.WriteLine("**悟空搶了公主的鐵扇**"); wukong.GetWeaponFrom(gongzhu); Console.Read();}

<a href="http://images.cnblogs.com/cnblogs_com/janes/201103/201103211616494161.png"></a>

OK.初學設計模式,想和大家交流一下。有什麼描述的不合适的地方,還請提出來。

    本文轉自 陳敬(Cathy) 部落格園部落格,原文連結:http://www.cnblogs.com/janes/archive/2011/03/21/1990389.html,如需轉載請自行聯系原作者

繼續閱讀