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

.Net行為型設(shè)計(jì)模式之策略模式(Stragety)

 更新時間:2022年05月26日 10:45:40   作者:springsnow  
這篇文章介紹了.Net行為型設(shè)計(jì)模式之策略模式(Stragety),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、動機(jī)(Motivate)

在軟件構(gòu)建過程中,某些對象使用的算法可能多種多樣,經(jīng)常改變,如果將這些算法都編碼到對象中,將會使對象變得異常復(fù)雜;而且有時候支持不使用的算法也是一個性能負(fù)擔(dān)。如何在運(yùn)行時根據(jù)需要透明地更改對象的算法?將算法與對象本身解耦,從而避免上述問題?

二、意圖(Intent)

定義一系列算法,把它們一個個封裝起來,并且使它們可互相替換。該模式使得算法可獨(dú)立于使用它的客戶而變化。                                 ——《設(shè)計(jì)模式》GoF

三、結(jié)構(gòu)圖(Structure)

四、模式的組成

可以看出,在策略模式的結(jié)構(gòu)圖有以下角色:
(1)、環(huán)境角色(Context):持有一個Strategy類的引用。
需要使用ConcreteStrategy提供的算法。
內(nèi)部維護(hù)一個Strategy的實(shí)例。
負(fù)責(zé)動態(tài)設(shè)置運(yùn)行時Strategy具體的實(shí)現(xiàn)算法。
負(fù)責(zé)跟Strategy之間的交互和數(shù)據(jù)傳遞
(2)、抽象策略角色(Strategy):定義了一個公共接口,各種不同的算法以不同的方式實(shí)現(xiàn)這個接口,Context使用這個接口調(diào)用不同的算法,一般使用接口或抽象類實(shí)現(xiàn)。
(3)、具體策略角色(ConcreteStrategy):實(shí)現(xiàn)了Strategy定義的接口,提供具體的算法實(shí)現(xiàn)。

五、策略模式的代碼實(shí)現(xiàn)

在現(xiàn)實(shí)生活中,策略模式的例子也是很多的,例如:一個公司會有很多工作種類,每個工作種類負(fù)責(zé)的工作不同,自然每個工種的工資計(jì)算方法也會有千差萬別,我們今天就以工資的計(jì)算為例來說明策略模式的使用,我們直接上代碼,但是實(shí)際編碼中切記別這樣,我們要通過迭代的方式使用模式。實(shí)現(xiàn)代碼如下:

public static void Main(String[] args)
{
    //普通員工的工資
    SalaryContext context = new SalaryContext(new NormalPeopleSalary());
    context.GetSalary(3000);

    //CEO的工資
    context.ISalaryStrategy = new CEOSalary();
    context.GetSalary(6000);

    Console.Read();
}
//環(huán)境角色---相當(dāng)于Context類型
public sealed class SalaryContext
{
    private ISalaryStrategy _strategy;

    public SalaryContext(ISalaryStrategy strategy)
    {
        this._strategy = strategy;
    }

    public ISalaryStrategy ISalaryStrategy
    {
        get { return _strategy; }
        set { _strategy = value; }
    }

    public void GetSalary(double income)
    {
        _strategy.CalculateSalary(income);
    }
}

//抽象策略角色---相當(dāng)于Strategy類型
public interface ISalaryStrategy
{
    //工資計(jì)算
    void CalculateSalary(double income);
}

//程序員的工資--相當(dāng)于具體策略角色ConcreteStrategyA
public sealed class ProgrammerSalary : ISalaryStrategy
{
    public void CalculateSalary(double income)
    {
        Console.WriteLine("我的工資是:基本工資(" + income + ")底薪(" + 8000 + ")+加班費(fèi)+項(xiàng)目獎金(10%)");
    }
}

//普通員工的工資---相當(dāng)于具體策略角色ConcreteStrategyB
public sealed class NormalPeopleSalary : ISalaryStrategy
{
    public void CalculateSalary(double income)
    {
        Console.WriteLine("我的工資是:基本工資(" + income + ")底薪(3000)+加班費(fèi)");
    }
}

//CEO的工資---相當(dāng)于具體策略角色ConcreteStrategyC
public sealed class CEOSalary : ISalaryStrategy
{
    public void CalculateSalary(double income)
    {
        Console.WriteLine("我的工資是:基本工資(" + income + ")底薪(20000)+項(xiàng)目獎金(20%)+公司股票");
    }
}

六、策略模式的實(shí)現(xiàn)要點(diǎn):

Strategy及其子類為組件提供了一系列可重用的算法,從而可以使得類型在運(yùn)行時方便地根據(jù)需要在各個算法之間進(jìn)行切換,所謂封裝算法,支持算法的變化。Strategy模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的代碼通常都需要Strategy模式。
與State類似,如果Strategy對象沒有實(shí)例變量,那么各個上下文可以共享一個Strategy對象,從而節(jié)省對象開銷。Strategy模式適用的是算法結(jié)構(gòu)中整個算法的改變,而不是算法中某個部分的改變。

  • Template Method方法:執(zhí)行算法的步驟協(xié)議是本身放在抽象類里面的,允許一個通用的算法操作多個可能實(shí)現(xiàn)
  • Strategy模式:執(zhí)行算法的協(xié)議是在具體類,每個具體實(shí)現(xiàn)有不同通用算法來做。

1、策略模式的主要優(yōu)點(diǎn)有:

1】、策略類之間可以自由切換。由于策略類都實(shí)現(xiàn)同一個接口,所以使它們之間可以自由切換。
2】、易于擴(kuò)展。增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼。
3】、避免使用多重條件選擇語句,充分體現(xiàn)面向?qū)ο笤O(shè)計(jì)思想。

2、策略模式的主要缺點(diǎn)有:

1】、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這點(diǎn)可以考慮使用IOC容器和依賴注入的方式來解決,關(guān)于IOC容器和依賴注入(Dependency Inject)的文章可以參考:IoC 容器和Dependency Injection 模式。
2】、策略模式會造成很多的策略類。

3、在下面的情況下可以考慮使用策略模式:

1】、一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種的情況下。那么這些算法可以包裝到一個個具體的算法類里面,并為這些具體的算法類提供一個統(tǒng)一的接口。
2】、如果一個對象有很多的行為,如果不使用合適的模式,這些行為就只好使用多重的if-else語句來實(shí)現(xiàn),此時,可以使用策略模式,把這些行為轉(zhuǎn)移到相應(yīng)的具體策略類里面,就可以避免使用難以維護(hù)的多重條件選擇語句,并體現(xiàn)面向?qū)ο笊婕暗母拍睢?/p>

七、.NET 策略模式的實(shí)現(xiàn)

在.NET Framework中也不乏策略模式的應(yīng)用例子。例如,在.NET中,為集合類型ArrayList和List<T>提供的排序功能,其中實(shí)現(xiàn)就利用了策略模式,定義了IComparer接口來對比較算法進(jìn)行封裝,實(shí)現(xiàn)IComparer接口的類可以是順序,或逆序地比較兩個對象的大小,具體.NET中的實(shí)現(xiàn)可以使用反編譯工具查看List<T>.Sort(IComparer<T>)的實(shí)現(xiàn)。其中List<T>就是承擔(dān)著環(huán)境角色,而IComparer<T>接口承擔(dān)著抽象策略角色,具體的策略角色就是實(shí)現(xiàn)了IComparer<T>接口的類,List<T>類本身實(shí)現(xiàn)了存在實(shí)現(xiàn)了該接口的類,我們可以自定義繼承與該接口的具體策略類。

到此這篇關(guān)于.Net行為型設(shè)計(jì)模式之策略模式(Stragety)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .Net?Core微服務(wù)rpc框架GRPC通信基礎(chǔ)

    .Net?Core微服務(wù)rpc框架GRPC通信基礎(chǔ)

    這篇文章介紹了.Net?Core微服務(wù)rpc框架GRPC通信的基礎(chǔ)應(yīng)用,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET?Core中的Configuration配置二

    ASP.NET?Core中的Configuration配置二

    這篇文章介紹了ASP.NET?Core中的Configuration配置,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    本文主要介紹Button、LinkButton和ImageButton 三種控件的使用方法,并一一舉例演示它們的用法,希望對大家有所幫助。
    2016-04-04
  • ORM框架之Dapper簡介和性能測試

    ORM框架之Dapper簡介和性能測試

    這篇文章介紹了ORM框架之Dapper簡介和性能測試,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET?Core在Linux下為dotnet創(chuàng)建守護(hù)進(jìn)程

    ASP.NET?Core在Linux下為dotnet創(chuàng)建守護(hù)進(jìn)程

    本篇主要是怎么樣為我們在Linux或者macOs中部署的dotnet程序創(chuàng)建一個守護(hù)進(jìn)程,來保證我們的程序在異?;蛘呤请娔X重啟的時候仍然能夠正常訪問。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • ASP.NET中Literal與Label控件的區(qū)別

    ASP.NET中Literal與Label控件的區(qū)別

    相信學(xué)ASP.NET的朋友們都會遇到Literal和Label到底該用那個的問題,Literal和Label到底有什么不同,其實(shí)簡單的講就是Literal不會產(chǎn)生HTML代碼,而Label會產(chǎn)生一個span標(biāo)記,下面為大家詳細(xì)講解一下。
    2016-04-04
  • ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

    ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性

    本文主要介紹ObjectDataSource控件和DataObjectTypeName屬性的用法,希望能給小伙伴們一些幫助。
    2016-04-04
  • .net6引入autofac框架

    .net6引入autofac框架

    這篇文章介紹了.net6引入autofac框架的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • .Net結(jié)構(gòu)型設(shè)計(jì)模式之外觀模式(Facade)

    .Net結(jié)構(gòu)型設(shè)計(jì)模式之外觀模式(Facade)

    這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之外觀模式(Facade),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • ASP.NET Core中的Options選項(xiàng)模式

    ASP.NET Core中的Options選項(xiàng)模式

    這篇文章介紹了ASP.NET Core中的Options選項(xiàng)模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論

绿春县| 沙洋县| 道真| 万安县| 新密市| 建瓯市| 泰顺县| 锦屏县| 望城县| 莆田市| 兴业县| 扶绥县| 和静县| 特克斯县| 南华县| 堆龙德庆县| 宁德市| 常德市| 梨树县| 南安市| 西丰县| 赤水市| 泾川县| 旺苍县| 哈巴河县| 北京市| 道真| 砀山县| 威海市| 高密市| 德保县| 靖州| 栖霞市| 措美县| 海城市| 阳信县| 湖州市| 北票市| 张掖市| 壤塘县| 民勤县|