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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

设计模式学习笔记--Strategy 策略模式

發布時間:2025/5/22 asp.net 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式学习笔记--Strategy 策略模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 所謂策略模式(Strategy Pattern),就是將策略 (算法) 封裝為一個對象,易于相互替換,如同 USB 設備一樣可即插即用;如果將策略、具體的算法和行為,編碼在某個類或客戶程序內部,將導至事后的修改和擴展不易。
? 當有多種「策略」時,通常的作法就是將這些個策略,和這些策略的算法、行為,分別封裝在各個類中,并讓這些類,去繼承某個公用的抽象類或接口。接著在客戶程序中,就可動態引用,且易于更換這些不同的「策略」,不會因為日后添加、修改了某一個「策略」,就得重新修改、編譯多處的源代碼。此即為一種「封裝變化點」的做法,將常會變化的部分進行抽象、定義為接口,亦即實現「面向接口編程」的概念。且客戶程序 (調用者) 只須知道接口的外部定義即可,具體的實現則無須理會。
?? 策略模式(Strategy Pattern)在外形上與狀態模式很相似,但在意圖上有些不同。其意圖是使這些算法可以相互替換,并提供一種方法來選擇最合適的算法。
?? 策略模式(Strategy Pattern)的UML圖如下:

????????????????????????
在策略模式里主要有三種角色:環境角色、抽象策略角色和具體策略角色
1、環境(Context)角色:持有一個抽象策略(Strategy)角色的引用。也叫上下文。
2、抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或一個抽象類來實現。
3、具體策略(ConcreteStrategy)角色:包裝了相應的算法和行為。
下面我們用代碼來示例策略模式,程序如下圖:

????????????????????????
一、策略模式基本思路示例

1、環境(Context)角色:

Code
using?System;
using
?System.Collections.Generic;
using
?System.Linq;
using
?System.Text;

namespace
?MyStrategyPattern
{
????
#region?定義Context類

????
class?Context
????{
????????
private
?Strategy?_strategy;

????????
#region?構造函數

????????
public?Context(Strategy?strategy)
????????{
????????????
this._strategy?=
?strategy;
????????}
????????
#endregion


????????
#region?定義算法接口
????????
//具體的算法由傳入的strategy對象的AlgorithmInterface方法來實現
????????public?void?ContextInterface()
????????{
????????????_strategy.AlgorithmInterface();
???????
?}
????????#endregion

????}
????
#endregion
}
2、抽象策略(Strategy)角色: Code
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?MyStrategyPattern
{
????
#region?抽象策略類Strategy,定義了具體策略類的共有算法接口
????
abstract??class?Strategy
????{
????????
public?abstract?void?AlgorithmInterface();
????}
????
#endregion
}
3、具體策略(ConcreteStrategy)角色:
Code
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?MyStrategyPattern
{?
????
//定義了一系列的具體策略類,它們繼承自抽象策略類

????
class?ConcreteStrategyA?:?Strategy
????{
????????
public?override?void?AlgorithmInterface()
????????{
????????????Console.WriteLine(
"使用了算法A來處理Context對象");
????????}
????}

????
class?ConcreteStrategyB?:?Strategy
????{
????????
public?override?void?AlgorithmInterface()
????????{
????????????Console.WriteLine(
"使用了算法B來處理Context對象");
????????}
????}

????
class?ConcreteStrategyC?:?Strategy
????{
????????
public?override?void?AlgorithmInterface()
????????{
????????????Console.WriteLine(
"使用了算法C來處理Context對象");
????????}
????}
}
4、客戶應用代碼 Code
????????????#region?基本思路示例
????????????Console.WriteLine(
"----策略模式基本思路示例----");
????????????Context?context;
????????????
//調用不同的算法來處理對象,算法的差異在Context傳參時(new?ConcreteStrategyA())決定
????????????context?=?new?Context(new?ConcreteStrategyA());
????????????context.ContextInterface();

????????????context?
=?new?Context(new?ConcreteStrategyB());
????????????context.ContextInterface();

????????????context?
=?new?Context(new?ConcreteStrategyC());
????????????context.ContextInterface();


????????????
#endregion

二、求和計算的策略模式示例


1、環境(Context)角色:CalculateContext. Code
using?System;
using
?System.Collections.Generic;
using
?System.Linq;
using
?System.Text;

namespace
?MyStrategyPattern
{
????
class
?CalculateContext
????{
????????ICalculateStrategy?_strategy;
????????
public
?CalculateContext(ICalculateStrategy?strategy)
????????{
????????????_strategy?
=
?strategy;
????????}

????????
public?void?PerformCalculation(List<int>
?list)
????????{
????????????Console.WriteLine(
string.Format("對列表中所有整數求和,結果為:{0}"
,?_strategy.Sum(list)));
????????}
????}
}

2、抽象策略(Strategy)角色:ICalculateStrategy

Code
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?MyStrategyPattern
{
????
interface??ICalculateStrategy
????{
????????
int?Sum(List<int>?list);
????}
}

3、具體策略(ConcreteStrategy)角色:CalculateStrategies


Code
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;

namespace?MyStrategyPattern
{
????
#region?方法A
????
class?ConcreteCalculateStrategyA?:?ICalculateStrategy
????{
????????
//利用List的Sum功能對List中整數求和
????????public?int?Sum(List<int>?list)
????????{
????????????Console.WriteLine(
"----。使用方法A進行求和----");
????????????
return?list.Sum();
????????}
????}
????
#endregion

????
#region?方法B
????
class?ConcreteCalculateStrategyB?:?ICalculateStrategy
????{
????????
//使用傳統的遍歷方法,對List中整數求和
????????public?int?Sum(List<int>?list)
????????{
????????????Console.WriteLine(
"----。使用方法B進行求和----");
????????????
int?result?=?0;
????????????
foreach(int?value?in?list)
????????????{
????????????????result?
+=?value;
????????????}
????????????
return?result;
????????}
????}
????
#endregion


}

4、客戶應用代碼

Code
???????????#region?求和計算的策略模式示例
????????????Console.WriteLine(
"\n\n----求和計算的策略模式示例----");
????????????List
<int>?lst?=?new?List<int>
();
????????????lst.Add(
3
);
????????????lst.Add(
6
);
????????????lst.Add(
8
);
????????????lst.Add(
9
);

????????????CalculateContext?caltext;
????????????caltext?
=?new?CalculateContext(new
?ConcreteCalculateStrategyA());
????????????caltext.PerformCalculation(lst);

????????????caltext?
=?new?CalculateContext(new
?ConcreteCalculateStrategyB());
????????????caltext.PerformCalculation(lst);

????????????Console.ReadKey();

????????????
#endregion

效果如下圖:
????????????????????????

總結:

Strategy Pattern 適用的情景:
1、應用中的許多類,在解決某些問題時很相似,但實現的行為有所差異。比如:不同功能的程序,都可能要用到「排序」算法。
2、根據運行環境的不同,需要采用不同的算法。比如:在手機、PC 計算機上,因硬件等級不同,必須采用不同的排序算法。
3、針對給定的目的,存在多種不同的算法,且我們可用代碼實現算法選擇的標準。
4、需要封裝復雜的數據結構。比如:特殊的加密算法,客戶程序僅需要知道調用的方式即可。
5、同上,算法中的羅輯和使用的數據,應該與客戶程序隔離時。

Strategy Pattern 的優點:
1、簡化了單元測試,因為每個算法都有自己的類,可以通過自己的接口單獨做測試。
2、避免程序中使用多重條件轉移語句,使系統更靈活,并易于擴展。
3、高內聚、低偶合。

Strategy Pattern 的缺點:
1、因為每個具體策略都會產生一個新類,所以會增加需要維護的類的數量。
2、選擇所用具體實現的職責由客戶程序承擔,并轉給 Context 對象,并沒有解除客戶端需要選擇判斷的壓力。
3、若要減輕客戶端壓力,或程序有特殊考量,還可把 Strategy 與 Simple Factory 兩種 Pattern 結合,即可將選擇具體算法的職責改由 Context 來承擔,亦即將具體的算法,和客戶程序做出隔離。

前往:設計模式學習筆記清單

轉載于:https://www.cnblogs.com/wsdj-ITtech/archive/2009/10/16/1584371.html

總結

以上是生活随笔為你收集整理的设计模式学习笔记--Strategy 策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美做受高潮动漫 | 国产免费av片在线 | 亚洲调教 | 婷婷一级片 | 亚洲精品乱码久久久久久久久久久久 | 日日爱夜夜操 | 国产视频一区二区在线 | 女人十八岁毛片 | 一区二区三区免费观看视频 | 蜜桃av噜噜一区二区三区小说 | 国产毛片欧美毛片久久久 | 老司机一区二区 | 综合另类 | 九九九精品视频 | 性——交——性——乱免费的 | 99久草 | 久久艹久久| 日韩一区二区三区不卡视频 | 天天干影院 | 欧美激情视频一区二区三区在线播放 | 国产精品久久久久久亚洲毛片 | 少妇被爽到高潮动态图 | 海角社区id | 成人免费毛片aaaaaa片 | 最新毛片网| 欧美人与性动交ccoo | 男人添女人荫蒂国产 | 亚洲国产日韩欧美一区二区三区 | www.日韩视频 | 日本裸体动漫 | 91九色视频在线 | 老牛影视av老牛影视av | 亚洲精品国产精品乱码不99热 | 久久yy | 日本免费无人高清 | 中文在线免费看视频 | 毛片在线免费观看网站 | 亚洲av无码国产精品麻豆天美 | 秋霞午夜网 | 四虎免费影视 | 香港台湾日本三级大全 | 日本黄xxxxxxxxx100 | 爽妇网国产精品 | 九九热久久免费视频 | 色94色欧美 | 波多野结衣免费视频观看 | 久草免费新视频 | 国产精品免费入口 | 男女啪啪免费网站 | 日韩欧美区 | 国产女同91疯狂高潮互磨 | 亚洲97 | 亚洲综合插 | 人妖一区| 日韩欧美一级视频 | 五月激情六月丁香 | 男女高潮网站 | 精品国产伦一区二区三 | 波多野结衣在线看 | 真实偷拍激情啪啪对白 | 视频在线观看网站免费 | 国产成人精品无码高潮 | 天天干夜夜夜夜 | 99视频免费看 | 花样视频污 | 99re6在线观看 | 猫咪av在线| 一级做a爰片 | 国产综合精品在线 | 免费a大片 | 精品人妻无码一区二区色欲产成人 | www.午夜av| 日韩精品一区二区在线视频 | 日本3p视频| 成人在线国产视频 | 成人动漫在线免费观看 | 精品国产网站 | 欧美黄色免费在线观看 | 精品乱子伦一区二区三区 | 亚洲一区二区三区观看 | 亚洲国产不卡 | 网站免费在线观看 | 在线观看香蕉视频 | 日韩精品毛片 | 欧美日韩性生活视频 | 欧美日韩视频在线观看免费 | 国产成人午夜视频 | 一级片观看 | 特黄特色大片免费 | 奇米激情| 天堂婷婷| 国产伦理一区二区 | 成人综合站 | av巨作| 高跟91白丝 | jlzzzjlzzz国产免费观看 | 日韩中文字幕精品 | 天天插天天 | 九九热在线视频免费观看 |