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

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>
              99re这里只有精品6| 99国产一区| 久久深夜福利| 久久视频在线视频| 亚洲精品欧美精品| 亚洲视频二区| 国产日韩欧美日韩| 欧美福利在线| 国产精品豆花视频| 久久综合色综合88| 欧美激情欧美狂野欧美精品| 在线亚洲观看| 欧美亚洲综合在线| 亚洲毛片av在线| 亚洲无吗在线| 亚洲国产导航| 亚洲女人天堂成人av在线| 精品盗摄一区二区三区| 99国产精品国产精品毛片| 国产一本一道久久香蕉| 亚洲人成毛片在线播放女女| 国产精品老牛| 亚洲电影毛片| 国产一区在线观看视频| 日韩午夜激情电影| 亚洲国产成人久久综合一区| 宅男噜噜噜66一区二区| 最新亚洲视频| 久久精品国产视频| 亚洲直播在线一区| 欧美电影美腿模特1979在线看| 欧美在线视频全部完| 欧美大尺度在线| 国产午夜精品美女视频明星a级| 欧美成人在线网站| 国产一区二区三区成人欧美日韩在线观看| 亚洲福利视频三区| 国产中文一区二区| 亚洲自拍高清| 亚洲天堂网在线观看| 你懂的亚洲视频| 久久一区二区三区四区| 国产精品视频一| 99精品国产在热久久婷婷| 亚洲国产美女精品久久久久∴| 午夜欧美大片免费观看| 亚洲网站视频福利| 欧美精品乱码久久久久久按摩| 美女91精品| 红桃视频国产一区| 久久国产精品久久久久久| 欧美一区二区大片| 国产精品爽爽ⅴa在线观看| 9l视频自拍蝌蚪9l视频成人| 日韩视频在线观看免费| 欧美成人免费观看| 亚洲国产精品传媒在线观看 | 亚洲国产国产亚洲一二三| 亚洲在线中文字幕| 亚洲欧美日韩成人高清在线一区| 欧美日韩免费区域视频在线观看| 亚洲高清视频在线观看| 亚洲美女诱惑| 欧美性片在线观看| 亚洲一区二区高清| 欧美一区成人| 国产亚洲成av人片在线观看桃| 亚洲综合精品自拍| 久久久国产精品一区二区三区| 国产一区二区高清不卡| 久久国产欧美日韩精品| 欧美成人综合网站| 亚洲精品色婷婷福利天堂| 欧美精品一区二区三区久久久竹菊| 亚洲人久久久| 亚洲影院色无极综合| 国产欧美一区二区三区沐欲| 欧美资源在线| 亚洲激情欧美| 亚洲自拍偷拍色片视频| 国产日韩专区| 免费看精品久久片| 一区二区三区国产在线| 久久九九99视频| 亚洲激情在线| 国产精品欧美日韩| 久久综合给合久久狠狠色 | 美女主播一区| 一区二区免费在线视频| 国产色产综合产在线视频| 麻豆freexxxx性91精品| 9l视频自拍蝌蚪9l视频成人| 久久青青草综合| 一区二区三区.www| 国产一区二区丝袜高跟鞋图片| 模特精品在线| 欧美一区二粉嫩精品国产一线天| 欧美不卡在线| 亚洲欧洲av一区二区三区久久| 蜜臀久久久99精品久久久久久| 日韩性生活视频| 久久综合网hezyo| 亚洲欧美成人| 亚洲精品一区二区三区蜜桃久 | 久久精品国产精品亚洲| 夜久久久久久| 欧美国产第二页| 西西人体一区二区| 日韩一本二本av| 精品成人久久| 国产毛片精品视频| 欧美日韩一区二区三区免费| 久久琪琪电影院| 亚洲综合成人婷婷小说| 亚洲国产一区在线观看| 久久噜噜亚洲综合| 性欧美8khd高清极品| 一本久道综合久久精品| 亚洲黄色成人久久久| 国产亚洲一区在线播放| 国产精品视频网站| 国产精品国产三级国产专播品爱网| 免费一区视频| 裸体女人亚洲精品一区| 久久久久88色偷偷免费| 欧美一区二区成人| 亚欧成人精品| 午夜视频在线观看一区| 亚洲男人的天堂在线aⅴ视频| 亚洲精品中文字幕有码专区| 亚洲福利在线观看| 欧美激情第9页| 欧美不卡在线| 亚洲电影在线| 亚洲国产欧美不卡在线观看| 欧美激情视频一区二区三区在线播放| 久久久亚洲欧洲日产国码αv| 欧美一区二区性| 久久成人免费| 久久婷婷久久| 男男成人高潮片免费网站| 理论片一区二区在线| 奶水喷射视频一区| 欧美激情精品久久久久久蜜臀| 免费不卡视频| 亚洲福利国产| 亚洲美女毛片| 亚洲一区二区三区四区视频 | 亚洲黄色三级| av成人毛片| 亚洲欧美日韩国产一区二区三区| 在线视频你懂得一区二区三区| 中文日韩欧美| 欧美在线亚洲| 欧美成人69| 欧美色一级片| 国产一区二区三区高清| 亚洲国产精品va在线看黑人| 99精品国产99久久久久久福利| 中日韩在线视频| 欧美专区日韩专区| 牛人盗摄一区二区三区视频| 亚洲国产精品嫩草影院| 亚洲午夜精品17c| 久久成人人人人精品欧| 欧美不卡一卡二卡免费版| 国产精品av久久久久久麻豆网| 国产日韩欧美精品| 亚洲人成欧美中文字幕| 小嫩嫩精品导航| 欧美福利影院| 亚洲专区一二三| 免费观看国产成人| 欧美午夜宅男影院在线观看| 狠狠久久五月精品中文字幕| 艳女tv在线观看国产一区| 久久久爽爽爽美女图片| 亚洲精品免费观看| 免费高清在线一区| 99精品黄色片免费大全| 久久久精品视频成人| 欧美日韩高清区| 伊人狠狠色j香婷婷综合| 亚洲天堂免费观看| 欧美国产一区视频在线观看| 亚洲综合色激情五月| 欧美黄免费看| 激情综合激情| 欧美一区二区三区视频在线观看 | 亚洲一区二区三区四区在线观看| 久久久午夜电影| 亚洲无人区一区| 欧美日韩免费高清一区色橹橹| 在线精品亚洲| 久久久久久久一区二区| 亚洲一区二区三区四区中文 | 国产最新精品精品你懂的| 亚洲天堂男人| 亚洲另类一区二区| 欧美成人一二三|