一、 定義
最近開始研讀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,如需轉載請自行聯系原作者