最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)策略模式

 更新時(shí)間:2022年07月11日 09:24:46   作者:奮斗的大橙子  
這篇文章介紹了C#實(shí)現(xiàn)策略模式的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

場(chǎng)景:有一個(gè)喜歡吃餃子,他有三種不同的方式去吃,蒸餃子,煮餃子,煎餃子,想要用策略模式來(lái)設(shè)計(jì)這個(gè)場(chǎng)景,怎么弄?

1.復(fù)習(xí)簡(jiǎn)單工廠模式

具體的代碼:

EatMethod.cs

public class EatMethod
{
   public virtual void Eat()
   {
      Console.WriteLine("This is the base class!");
   }
}

Steamed.cs

class Steamed : EatMethod
{
   public override void Eat()
   {
       Console.WriteLine("This is steamed dumplings!");
   }
}

Boiled.cs

class Boiled : EatMethod
{
   public override void Eat()
   {
     Console.WriteLine("This is boiled dumplings!");
   }
}

Fried.cs

class Boiled : EatMethod
{
   public override void Eat()
   {
     Console.WriteLine("This is boiled dumplings!");
   }
}

EatFactory.cs

public static class EatFactory
{
   public static EatMethod CreateEatMethod(string eatMethod)
   {
       EatMethod eat = null;
       switch (eatMethod)
       {
          case "Steamed":
               eat = new Steamed();
               break;
          case "Boiled":
               eat = new Boiled();
               break;
          case "Fried":
               eat = new Fried();
               break;
          default:
               break;
            }
        return eat;
    }
}

Program.cs

class Program
{
    static void Main(string[] args)
    {
        EatMethod eat = EatFactory.CreateEatMethod("Steamed");
        eat.Eat();
        eat = EatFactory.CreateEatMethod("Boiled");
        eat.Eat();
        eat = EatFactory.CreateEatMethod("Fried");
        eat.Eat();
    }
}

測(cè)試結(jié)果:

2.策略模式來(lái)設(shè)計(jì)

上面雖然用簡(jiǎn)單工廠實(shí)現(xiàn)了,但是感覺(jué)各種吃餃子的方式,用工廠來(lái)創(chuàng)建還是顯得比較生硬,每一種吃法應(yīng)該看成是一種算法,最終的目的都是吃掉,所以這里就引出了策略模式的概念了。

策略模式的用意是針對(duì)一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類(lèi)中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化。

這個(gè)模式涉及到三個(gè)角色:

環(huán)境(Context)角色:持有一個(gè)Strategy類(lèi)的引用。抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類(lèi)實(shí)現(xiàn)。此角色給出所有的具體策略類(lèi)所需的接口。具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為。

看了UML圖感覺(jué)和簡(jiǎn)單工廠也沒(méi)啥區(qū)別啊,不過(guò)是把Factory變成了Context而已,但是還是有些不同的,詳見(jiàn)//m.fzitv.net/article/254877.htm

這里和上面的簡(jiǎn)單工廠只有EatContext和客戶端不一樣

EatContext.cs

public class EatContext  
 {
      private EatMethod _eat;

      public EatContext(EatMethod eat)
      {
          _eat = eat;
      }

      public void Eat()
      {
         _eat.Eat();
      }
 }

Program.cs

EatContext ec = new EatContext(new Steamed());
ec.Eat();
ec = new EatContext(new Boiled());
ec.Eat();
ec = new EatContext(new Fried());
ec.Eat();

測(cè)試執(zhí)行結(jié)果:

3.對(duì)比策略模式和簡(jiǎn)單工廠模式

我的理解是這樣的:

首先是簡(jiǎn)單工廠模式:

客戶端去調(diào)用工廠中的CreateEatMenthod方法,從輸入上看,是一個(gè)字符串,指明了我想要的對(duì)象,然后工廠方法,就返回了一個(gè)我想要的對(duì)象,后面的具體的Eat(),是在客戶端使用返回的對(duì)象進(jìn)行調(diào)用的。

然后是策略模式:

客戶端實(shí)例化一個(gè)EatContext對(duì)象,傳入的參數(shù)是一個(gè)具體的怎么做餃子的對(duì)象,然后EatContext根據(jù)傳入的對(duì)象,來(lái)初始化一個(gè)EatContext對(duì)象,后續(xù)的客戶端操作通過(guò)的是EatContext的實(shí)例對(duì)象來(lái)完成的。

上面也能看出來(lái),簡(jiǎn)單工廠用于創(chuàng)建對(duì)象,而策略模式更在乎控制行為,所以前者是創(chuàng)建型模式,后者是行為型模式。

實(shí)際應(yīng)用中,可以將兩者在進(jìn)一步結(jié)合,再修改一下程序

EatFactoryContext.cs

public class EatFactoryContext
{
    EatMethod _eat = null;
    public EatFactoryContext(string eatMethod)
    {
        switch (eatMethod)
        {
            case "Steamed":
                _eat = new Steamed();
                break;
            case "Boiled":
                _eat = new Boiled();
                break;
            case "Fried":
                _eat = new Fried();
                break;
            default:
                break;
            }
        }

   public void Eat()
   {
      _eat.Eat();
   }
}

Program.cs

#region 結(jié)合
EatFactoryContext efc = new EatFactoryContext("Steamed");
efc.Eat();
efc = new EatFactoryContext("Boiled");
efc.Eat();
efc = new EatFactoryContext("Fried");
efc.Eat();
#endregion

測(cè)試結(jié)果:

4.總結(jié)

經(jīng)過(guò)學(xué)習(xí)呢,發(fā)現(xiàn)是能夠把簡(jiǎn)單工廠和策略模式進(jìn)行基本的了解,但是如果工作中沒(méi)有實(shí)際遇到,的確對(duì)于兩者的區(qū)別的理解感到困惑,可能很多人和我一樣,都是看到UML圖發(fā)現(xiàn),兩者好像沒(méi)有什么差別,可能理解還不深入吧,寫(xiě)得可能有些地方還不是很正確,希望看到的高手能指點(diǎn)一二。

到此這篇關(guān)于C#實(shí)現(xiàn)策略模式的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#基礎(chǔ)知識(shí)之new關(guān)鍵字介紹

    C#基礎(chǔ)知識(shí)之new關(guān)鍵字介紹

    在 C# 中,new 關(guān)鍵字可用作運(yùn)算符、修飾符或約束,本文主要介紹這三種用法。
    2016-04-04
  • C#實(shí)現(xiàn)一階卡爾曼濾波算法的示例代碼

    C#實(shí)現(xiàn)一階卡爾曼濾波算法的示例代碼

    這篇文章主要介紹了C#實(shí)現(xiàn)一階卡爾曼濾波算法的示例代碼,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#遞歸算法之快速排序

    C#遞歸算法之快速排序

    快速排序由C.A.R發(fā)明,它依據(jù)中心元素的值,利用一系列遞歸調(diào)用將數(shù)據(jù)表劃分成越來(lái)越小的子表。在每一步調(diào)用中,經(jīng)過(guò)多次的交換,最終為中心元素找到最終的位置。
    2016-06-06
  • C#聊天程序服務(wù)端與客戶端完整實(shí)例代碼

    C#聊天程序服務(wù)端與客戶端完整實(shí)例代碼

    這篇文章主要介紹了C#聊天程序服務(wù)端與客戶端完整實(shí)例代碼,很經(jīng)典的應(yīng)用,需要的朋友可以參考下
    2014-07-07
  • C#安裝OpenCvSharp4的實(shí)現(xiàn)步驟

    C#安裝OpenCvSharp4的實(shí)現(xiàn)步驟

    OpenCv是一款開(kāi)源的圖像處理庫(kù),本文就介紹了C#安裝OpenCvSharp4的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • C#索引器介紹

    C#索引器介紹

    這篇文章主要介紹了C#索引器介紹,索引器是一種特殊的類(lèi)成員,它能夠讓對(duì)象以類(lèi)似數(shù)組的方式來(lái)存取,使程序看起來(lái)更為直觀,更容易編寫(xiě),需要的朋友可以參考下
    2014-10-10
  • C#從實(shí)體對(duì)象集合中導(dǎo)出Excel的代碼

    C#從實(shí)體對(duì)象集合中導(dǎo)出Excel的代碼

    數(shù)據(jù)的導(dǎo)出是項(xiàng)目中經(jīng)常要實(shí)現(xiàn)的功能,就拿最常見(jiàn)的要導(dǎo)出成Excel來(lái)說(shuō),網(wǎng)上看來(lái)看去,都是介紹從Datatable中導(dǎo)出
    2008-08-08
  • C# wpf Canvas中實(shí)現(xiàn)控件拖動(dòng)調(diào)整大小的示例

    C# wpf Canvas中實(shí)現(xiàn)控件拖動(dòng)調(diào)整大小的示例

    本文主要介紹了C# wpf Canvas中實(shí)現(xiàn)控件拖動(dòng)調(diào)整大小的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 基于C#實(shí)現(xiàn)獲取Windows所有窗口句柄

    基于C#實(shí)現(xiàn)獲取Windows所有窗口句柄

    在做錄屏或截屏操作時(shí),需要獲取當(dāng)前正在運(yùn)行中的桌面程序句柄,所以這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)獲取Windows所有窗口句柄,需要的可以參考下
    2023-12-12
  • C# 生成隨機(jī)數(shù)的代碼

    C# 生成隨機(jī)數(shù)的代碼

    這篇文章主要介紹了C# 生成隨機(jī)數(shù)的代碼的相關(guān)資料,非常的簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

台北市| 崇仁县| 邵东县| 余庆县| 正安县| 崇文区| 新竹县| 宝兴县| 沅陵县| 新安县| 永安市| 无为县| 广灵县| 丰都县| 肃宁县| 太白县| 紫阳县| 泾川县| 聂荣县| 东辽县| 武山县| 镇巴县| 上高县| 平陆县| 沁阳市| 平罗县| 临沭县| 沿河| 砀山县| 陇川县| 灯塔市| 大足县| 上犹县| 特克斯县| 金川县| 吴桥县| 朝阳县| 如东县| 邓州市| 湘阴县| 宜州市|