浅谈设计模式01-策略模式
2019獨角獸企業重金招聘Python工程師標準>>>
一、?定義
最近開始研讀Head First設計模式,這本書給人的感覺耳目一新,不容易犯困啊。今天和大家分享一下策略模式。
1.?定義:
策略模式定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用該算法的客戶。
上圖為策略模式結構圖,其中:
- 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 ZhuBajie : Role
{
public override void Introduce()
{
Console.WriteLine("我乃天蓬元帥豬八戒!");
}
public override void Fight()
{
Console.WriteLine("看我一耙!");
}
}
/// 鐵扇公主
public class TieshanGongzhu : Role
{
public override void Introduce()
{
Console.WriteLine("我乃鐵扇公主!");
}
public override void Fight()
{
Console.WriteLine("看我一扇,讓你飛到天邊!");
}
}
}
- Program.cs調用
class Program
{
static void Main(string[] args)
{
Console.WriteLine("簡單亮相:");
SunWukong wukong = new SunWukong();
wukong.Introduce();
wukong.Fight();
ZhuBajie bajie = new ZhuBajie();
bajie.Introduce();
bajie.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()
{
Console.WriteLine("看我的如意金箍棒!");
}
}
//鐵扇武器戰斗
public class TieShan?: IFight
{
public void fight()
{
Console.WriteLine("看我一扇,讓你飛到天邊!");
}
}
?
? //空手戰斗
??? public class Kongshou : IFight
??? {
??????? public void fight()
??????? {
??????????? Console.WriteLine("完了!我沒有武器了。");
??????? }
??? }
?
- 抽象角色類Role:其中包含IFight行為實例;改變武器的方法;以及調用fight()的方法。
public?abstract?class Role
{
public?IFight?fight;//IFight接口的實例
public abstract void Introduce();
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 class SunWukong : Role
{
public SunWukong()
{//初始化武器
base.fight = new JinGuBang();
}
public override void Introduce()
{
Console.WriteLine("我乃齊天大圣孫悟空!");
}
}
/// 鐵扇公主
public class TieshanGongzhu : Role
{
public TieshanGongzhu()
{
base.fight = new TieShan();
}
public override void Introduce()
{
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.WriteLine("**悟空搶了公主的鐵扇**");
wukong.GetWeaponFrom(gongzhu);
gongzhu.Introduce();
gongzhu.Fight();
wukong.Introduce();
wukong.Fight();
Console.Read();}
}
OK.初學設計模式,想和大家交流一下。有什么描述的不合適的地方,還請提出來。
轉載于:https://my.oschina.net/networker/blog/14471
總結
以上是生活随笔為你收集整理的浅谈设计模式01-策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XP的DNS服务器(BIND)配置
- 下一篇: 效率 人vs机器