日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

浅谈设计模式01-策略模式

發布時間:2025/3/20 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈设计模式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-策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。