青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

模式設計c#--行為型--strategy

名稱 Strategy
結構 o_strategy.bmp
意圖 定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。
適用性
  • 許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
  • 需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的算法。當這些變體實現為一個算法的類層次時[ H O 8 7 ] ,可以使用策略模式。
  • 算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。
  • 一個類定義了多種行為, 并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的S t r a t e g y 類中以代替這些條件語句。

namespace ?Strategy_DesignPattern
{
????
using ?System;

????
????
abstract ? class ?Strategy?
????
{
????????
abstract ? public ? void ?DoAlgorithm();
????}


????
class ?FirstStrategy?:?Strategy?
????
{
????????
override ? public ? void ?DoAlgorithm()
????????
{
????????????Console.WriteLine(
" In?first?strategy " );????????????
????????}

????}


????
class ?SecondStrategy?:?Strategy?
????
{
????????
override ? public ? void ?DoAlgorithm()
????????
{
????????????Console.WriteLine(
" In?second?strategy " );????????????
????????}

????}


????
class ?Context?
????
{
????????Strategy?s;
????????
public ?Context(Strategy?strat)
????????
{
????????????s?
= ?strat;????????????
????????}


????????
public ? void ?DoWork()
????????
{
????????????
// ?some?of?the?context's?own?code?goes?here
????????}


????????
public ? void ?DoStrategyWork()
????????
{
????????????
// ?now?we?can?hand?off?to?the?strategy?to?do?some?
????????????
// ?more?work
????????????s.DoAlgorithm();
????????}

????}


????
/// ? <summary>
????
/// ????Summary?description?for?Client.
????
/// ? </summary>

???? public ? class ?Client
????
{
????????
public ? static ? int ?Main( string []?args)
????????
{????
????????????FirstStrategy?firstStrategy?
= ? new ?FirstStrategy();
????????????Context?c?
= ? new ?Context(firstStrategy);
????????????c.DoWork();
????????????c.DoStrategyWork();

????????????
return ? 0 ;
????????}

????}

}


一、?策略(Strategy)模式

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

假設現在要設計一個販賣各類書籍的電子商務網站的購物車(Shopping Cat)系統。一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這要復雜。比如,本網站可能對所有的教材類圖書實行每本一元的折扣;對連環畫類圖書提供每本7%的促銷折扣,而對非教材類的計算機圖書有3%的折扣;對其余的圖書沒有折扣。由于有這樣復雜的折扣算法,使得價格計算問題需要系統地解決。

使用策略模式可以把行為和環境分割開來。環境類負責維持和查詢行為類,各種算法則在具體策略類(ConcreteStrategy)中提供。由于算法和環境獨立開來,算法的增減、修改都不會影響環境和客戶端。當出現新的促銷折扣或現有的折扣政策出現變化時,只需要實現新的策略類,并在客戶端登記即可。策略模式相當于"可插入式(Pluggable)的算法"。
?何時使用何種具體策略角色

在學習策略模式時,學員常問的一個問題是:為什么不能從策略模式中看出哪一個具體策略適用于哪一種情況呢?

答案非常簡單,策略模式并不負責做這個決定。換言之,應當由客戶端自己決定在什么情況下使用什么具體策略角色。策略模式僅僅封裝算法,提供新算法插入到已有系統中,以及老算法從系統中"退休"的方便,策略模式并不決定在何時使用何種算法。
sort()很好的例子:

// ?Strategy?pattern?--?Real?World?example??
using ?System;
using ?System.Collections;

// ?"Strategy"
abstract ? class ?SortStrategy
{
??
// ?Methods
?? abstract ? public ? void ?Sort(?ArrayList?list?);
}


// ?"ConcreteStrategy"
class ?QuickSort?:?SortStrategy
{
??
// ?Methods
?? public ? override ? void ?Sort(ArrayList?list?)
??
{
????list.Sort();?
// ?Default?is?Quicksort
????Console.WriteLine( " QuickSorted?list? " );
??}

}


// ?"ConcreteStrategy"
class ?ShellSort?:?SortStrategy
{
??
// ?Methods
?? public ? override ? void ?Sort(ArrayList?list?)
??
{
????
// list.ShellSort();
????Console.WriteLine( " ShellSorted?list? " );
??}

}


// ?"ConcreteStrategy"
class ?MergeSort?:?SortStrategy
{
??
// ?Methods
?? public ? override ? void ?Sort(?ArrayList?list?)
??
{
????
// list.MergeSort();
????Console.WriteLine( " MergeSorted?list? " );
??}

}


// ?"Context"
class ?SortedList
{
??
// ?Fields
?? private ?ArrayList?list? = ? new ?ArrayList();
??
private ?SortStrategy?sortstrategy;

??
// ?Constructors
?? public ? void ?SetSortStrategy(?SortStrategy?sortstrategy?)
??
{
????
this .sortstrategy? = ?sortstrategy;
??}


??
// ?Methods
?? public ? void ?Sort()
??
{
????sortstrategy.Sort(?list?);
??}


??
public ? void ?Add(? string ?name?)
??
{
????list.Add(?name?);
??}


??
public ? void ?Display()
??
{
????
foreach (? string ?name? in ?list?)
??????Console.WriteLine(?
" ? " ? + ?name?);
??}

}


/**/ /// ? <summary>
/// ?StrategyApp?test
/// ? </summary>

public ? class ?StrategyApp
{
??
public ? static ? void ?Main(? string []?args?)
??
{
????
// ?Two?contexts?following?different?strategies
????SortedList?studentRecords? = ? new ?SortedList(?);
????studentRecords.Add(?
" Samual " ?);
????studentRecords.Add(?
" Jimmy " ?);
????studentRecords.Add(?
" Sandra " ?);
????studentRecords.Add(?
" Anna " ?);
????studentRecords.Add(?
" Vivek " ?);

????studentRecords.SetSortStrategy(?
new ?QuickSort()?);
????studentRecords.Sort();
????studentRecords.Display();
??}

}

六、?在什么情況下應當使用策略模式

在下面的情況下應當考慮使用策略模式:

1.?如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。

2.?一個系統需要動態地在幾種算法中選擇一種。那么這些算法可以包裝到一個個的具體算法類里面,而這些具體算法類都是一個抽象算法類的子類。換言之,這些具體算法類均有統一的接口,由于多態性原則,客戶端可以選擇使用任何一個具體算法類,并只持有一個數據類型是抽象算法類的對象。

3.?一個系統的算法使用的數據不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復雜的和只與算法有關的數據。

4.?如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。此時,使用策略模式,把這些行為轉移到相應的具體策略類里面,就可以避免使用難以維護的多重條件選擇語句,并體現面向對象設計的概念。


七、?策略模式的優點和缺點

策略模式有很多優點和缺點。它的優點有:

1.?策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類里面,從而避免重復的代碼。

2.?策略模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行為變得不可能。

3.?使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重轉移語句里面,比使用繼承的辦法還要原始和落后。

策略模式的缺點有:

1.?客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。

2.?策略模式造成很多的策略類。有時候可以通過把依賴于環境的狀態保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。


八、?其它

策略模式與很多其它的模式都有著廣泛的聯系。Strategy很容易和Bridge模式相混淆。雖然它們結構很相似,但它們卻是為解決不同的問題而設計的。Strategy模式注重于算法的封裝,而Bridge模式注重于分離抽象和實現,為一個抽象體系提供不同的實現。Bridge模式與Strategy模式都很好的體現了"Favor composite over inheritance"的觀點。

posted on 2006-01-03 16:17 夢在天涯 閱讀(1002) 評論(0)  編輯 收藏 引用 所屬分類: Design pattern

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812168
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧洲99久久| 久久精品一区二区三区中文字幕| 欧美成人dvd在线视频| 欧美一区二区精品久久911| 亚洲欧美中文日韩在线| 欧美一区二区私人影院日本| 久久国产手机看片| 免费在线观看日韩欧美| 欧美日韩国产精品一区| 欧美日韩在线播放一区二区| 欧美性猛片xxxx免费看久爱| 国产欧美日韩一区| 经典三级久久| 日韩视频在线一区二区三区| aa成人免费视频| 性做久久久久久久久| 久久久99精品免费观看不卡| 久久久精品国产免大香伊| 久久久欧美一区二区| 欧美 日韩 国产 一区| 一本色道久久综合亚洲精品不| 国产日韩欧美一区| 欧美日韩国产在线看| 欧美大片国产精品| 乱中年女人伦av一区二区| 久久成人精品无人区| 亚洲美女在线视频| 欧美高清视频在线| 美女视频黄免费的久久| 久久乐国产精品| 欧美福利视频在线观看| 亚洲国产精品美女| 亚洲精品久久在线| 亚洲一区二区三区精品在线| 久久超碰97人人做人人爱| 久久久久久综合| 欧美成人免费一级人片100| 欧美色视频在线| 国产专区综合网| 日韩午夜电影av| 99国产精品国产精品久久| 亚洲国产精品一区二区三区| 一区二区三区免费观看| 欧美在线一二三区| 亚洲图片在线| 亚洲青涩在线| 日韩一区二区电影网| 午夜精品福利视频| 蜜桃久久av一区| 99精品欧美一区二区三区| 欧美在线中文字幕| 欧美日韩免费在线观看| 国产综合久久久久影院| 亚洲视频在线观看| 免费亚洲一区二区| 亚洲视频综合| 欧美精品粉嫩高潮一区二区 | 亚洲第一页中文字幕| 一本色道久久综合狠狠躁篇的优点| 亚洲一区在线播放| 欧美激情第五页| 国产日韩专区| 亚洲男人的天堂在线aⅴ视频| 欧美成人一区二区| 性欧美大战久久久久久久免费观看 | 欧美日本精品| 亚洲第一网站| 久久久噜噜噜| 亚洲人成网站777色婷婷| 亚洲在线观看免费| 久久精品一区蜜桃臀影院| 欧美日韩福利在线观看| 国产欧美日韩在线| 9色精品在线| 美女脱光内衣内裤视频久久影院 | 亚洲视频在线看| 欧美日韩国产综合久久| 亚洲精品视频在线| 欧美电影免费观看高清完整版| 欧美一级淫片播放口| 国产精品久久久久99| 亚洲综合第一| 亚洲专区在线| 国产日韩欧美在线一区| 欧美一区二区免费视频| 亚洲一级在线| 国产美女精品| 久久久久免费视频| 久久久777| 亚洲第一成人在线| 欧美成人性网| 伊人成人在线| 久久在线免费观看视频| 国产精品久久久久毛片软件 | 亚洲免费在线精品一区| 亚洲精品美女在线| 欧美经典一区二区三区| 99国产精品久久久久老师| 亚洲精品国精品久久99热| 欧美日韩成人在线视频| 亚洲午夜在线视频| 亚洲综合不卡| 模特精品在线| 亚洲一区二区综合| 亚洲无亚洲人成网站77777| 久久先锋资源| 欧美成人在线影院| 亚洲一二三区在线观看| 亚洲欧美精品suv| 国内伊人久久久久久网站视频 | 久久久五月天| 欧美不卡一区| 午夜伦欧美伦电影理论片| 欧美中文日韩| 99riav国产精品| 亚洲性图久久| 又紧又大又爽精品一区二区| 91久久一区二区| 国产精品一区久久久| 欧美成人精品一区二区三区| 欧美激情网站在线观看| 性亚洲最疯狂xxxx高清| 蜜桃视频一区| 欧美一区二区三区另类| 欧美大片在线观看| 欧美在线视频一区二区三区| 欧美高清视频www夜色资源网| 亚洲一区黄色| 美女999久久久精品视频| 亚洲淫片在线视频| 久久综合网色—综合色88| 亚洲免费视频成人| 欧美超级免费视 在线| 久久成人资源| 欧美三级乱码| 最新日韩在线| 国产精品久久国产精品99gif| 久久大香伊蕉在人线观看热2| 久久人人爽人人爽爽久久| 日韩亚洲综合在线| 亚洲图片欧美午夜| 国外视频精品毛片| 91久久精品国产91久久性色| 狠狠色丁香久久婷婷综合_中| avtt综合网| 亚洲国产精品一区二区三区| 性高湖久久久久久久久| 亚洲欧美日韩专区| 模特精品裸拍一区| 中日韩视频在线观看| 久久成人人人人精品欧| 91久久夜色精品国产网站| 中文在线一区| 在线成人激情视频| 亚洲欧美激情精品一区二区| 最新国产成人av网站网址麻豆| 亚洲精品久久久蜜桃| 国产精品一区二区三区观看| 美女任你摸久久| 国产精品福利在线观看| 欧美成人综合网站| 国产美女扒开尿口久久久| 欧美亚洲在线| 亚洲国产成人高清精品| 在线日韩日本国产亚洲| 久久精品av麻豆的观看方式 | 最新国产の精品合集bt伙计| 久久一区精品| 欧美激情精品久久久久久免费印度 | 在线亚洲高清视频| 亚洲女爱视频在线| 国产精品私拍pans大尺度在线| 在线亚洲+欧美+日本专区| 午夜免费日韩视频| 国产综合欧美在线看| 久久久久久久一区| 欧美高清在线一区二区| 亚洲精品麻豆| 欧美日韩在线播放三区四区| 一区二区日本视频| 久久爱另类一区二区小说| 欧美日韩精品一区二区三区| 久久人体大胆视频| 国产综合自拍| 亚洲欧美另类综合偷拍| 亚洲综合电影一区二区三区| 欧美高清在线| 亚洲福利电影| 亚洲国产高清在线| 久久蜜桃精品| 毛片一区二区| 一色屋精品视频在线看| 欧美一区二区三区在线免费观看 | 亚洲精品中文字幕在线观看| 欧美日韩在线一区二区| 欧美伊人久久大香线蕉综合69| 欧美成人r级一区二区三区| 亚洲色诱最新| 欧美精品一区二区三区蜜桃| 亚洲无线一线二线三线区别av|