成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 關(guān)于.NET Framework中的設(shè)計模式--應(yīng)用策略模式為List排序

關(guān)于.NET Framework中的設(shè)計模式--應(yīng)用策略模式為List排序

熱門標簽:濟源人工智能電話機器人價格 山東防封電銷卡辦理套餐 廈門四川外呼系統(tǒng) 百度地圖標注點擊事件 泰州手機外呼系統(tǒng)軟件 內(nèi)蒙古智能電銷機器人哪家強 杭州智能電話機器人 地圖標注位置多的錢 怎樣在地圖標注消火栓圖形
簡單類型排序

編程時遇到排序在平常不過,使用.Net最常見的就是對泛型ListT>進行排序,如果T是簡單數(shù)據(jù)類型排序那么很簡單

復(fù)制代碼 代碼如下:

public Listint> SortSimpleList(Listint> list)
{
list.Sort();
return list;
}

同樣對string等簡單類型ListT>排序均如此,如果我們要排的對象復(fù)雜了怎么辦,我們知道ListT> sort()最后是用快速排序?qū)崿F(xiàn),快速排序也好,什么排序都需要知道list中item之間的比較結(jié)果,如果是簡單的int類型,直接判斷即可,對實現(xiàn)了IComparable接口的對象,可以調(diào)用其CompareTo()實現(xiàn)item比較大小,下面是一個快速排序的寫法

復(fù)制代碼 代碼如下:

void SortT>(T[] array, int left, int right, IComparer_slyT> comparer) where T : IComparable
{
if (left right)
{
T middle = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (array[++i].CompareTo(middle) 0) ;

while (array[--j].CompareTo(middle) > 0) ;

if (i >= j)
break;

T temp = array[i];
array[i] = array[j];
array[j] = temp;
}

Sort(array, left, i - 1, comparer);
Sort(array, j + 1, right, comparer);
}
}

問題

對于前兩種情況固然可以實現(xiàn)排序,但是我們不可能要求所有待排序的對象都實現(xiàn)IComparable接口,就算能夠保證每個對象都實現(xiàn)IComparable接口,如果想實現(xiàn)對象內(nèi)多個字段排序,比如Student對象,有時候想按照姓名排序,有時候是成績,有時候是年齡,這怎么破

按照面向?qū)ο蟮乃枷?,要把變化獨立出來,封裝變化,對于我們排序ListT>時變化的其實就是怎么比較兩個對象的大小的算法,如果我們可以把這個算法拿出來,排序就簡單了很多,無論什么排序,算法都是由的,我們要封裝的部分是怎樣比較兩個item的大小的算法,為了實現(xiàn)拓展性我們要遵循面向?qū)ο笤O(shè)計的另外一個重要原則,針對接口編程,而不是針對實現(xiàn)編程。

編寫通用的ListT>排序方法

首先定義一個接口,里面有一個比較item大小的方法,在排序的時候作為參數(shù)傳入,當然是傳入它的實現(xiàn)類,有了這個想法,我們可以自己寫個ListT>的排序方法

復(fù)制代碼 代碼如下:

public interface mparer_slyT>{
int Compare(T x, T y);
}

然后為了測試,我們?yōu)長istT>加一個包裝,寫一個自己的Sort方法,內(nèi)部也用快速排序?qū)崿F(xiàn)。一直困惑我們的變化部分——比較大小算法,我們把它封轉(zhuǎn)起來,作為參數(shù)傳入

復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;

namespace Test.Stategy
{public class ListTestT>
{
public ListT> list = new ListT>();
public void Sort(IComparer_slyT> comparer)
{
T[] array = list.ToArray();
int left = 0;
int right = array.Length - 1;
QuickSort(array, left, right, comparer);
list = new ListT>(array);
}

private void QuickSortS>(S[] array, int left, int right, IComparer_slyS> comparer)
{
if (left right)
{
S middle = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (comparer.Compare(array[++i], middle) 0) ;

while (comparer.Compare(array[--j], middle) > 0) ;

if (i >= j)
break;

S temp = array[i];
array[i] = array[j];
array[j] = temp;
}

QuickSort(array, left, i - 1, comparer);
QuickSort(array, j + 1, right, comparer);
}
}
}
}

比如現(xiàn)在我們有個Student 的實體

復(fù)制代碼 代碼如下:

public class Student
{
public Student(int id, string name)
{
this.ID = id;
this.Name = name;
}
public int ID { get; set; }
public string Name { get; set; }
}

如果想對這個實體組成的ListT>進行排序,我們只需一個實現(xiàn) IComparer_slyStudent>的類 StudentComparer,并在內(nèi)部實現(xiàn)其比較大小方法——Compare(),同時我們可以添加遞增還是遞減排序的控制

復(fù)制代碼 代碼如下:

class StudentComparer : IComparer_slyStudent>
{
private string expression;
private bool isAscending;
public StudentComparer(string expression, bool isAscending)
{
this.expression = expression;
this.isAscending = isAscending;
}

public int Compare(Student x, Student y)
{
object v1 = GetValue(x), v2 = GetValue(y);
if (v1 is string || v2 is string)
{
string s1 = ((v1 == null) ? "" : v1.ToString().Trim());
string s2 = ((v2 == null) ? "" : v2.ToString().Trim());
if (s1.Length == 0 s2.Length == 0)
return 0;
else if (s2.Length == 0)
return -1;
else if (s1.Length == 0)
return 1;
}

// 這里就偷懶調(diào)用系統(tǒng)方法,不自己實現(xiàn)了,其實就是比較兩個任意相投類型數(shù)據(jù)大小,自己實現(xiàn)比較麻煩
if (!isAscending)
return Comparer.Default.Compare(v2, v1);
return Comparer.Default.Compare(v1, v2);
}

private object GetValue(Student stu)
{
object v = null;
switch (expression)
{
case "id":
v = stu.ID;
break;
case "name":
v = stu.Name;
break;
default:
v = null;
break;
}
return v;
}
}

測試一下好不好使

復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
ListTestStudent> test = new ListTestStudent>();
for (int i = 0; i 10; i++)
{
Student stu = new Student(i,string.Format("N_"+(9-i)));
test.list.Add(stu);
}
Console.WriteLine("元數(shù)據(jù)");
for (int i = 0; i test.list.Count;i++ )
{
Console.WriteLine(string.Format("ID:{0} , Name:{1}", test.list[i].ID, test.list[i].Name));
}

Console.WriteLine("Name 遞增");
test.Sort(new StudentComparer("name", true));
for (int i = 0; i test.list.Count; i++)
{
Console.WriteLine(string.Format("ID:{0} , Name:{1}", test.list[i].ID, test.list[i].Name));
}
}

看看效果

.NET List的sort如何為我們排序

用ILSpy反編譯可以看到在調(diào)用ListT>的sort()方法時內(nèi)部調(diào)用的時 this.Sort(0, this.Count, null); 然后往里面扒,經(jīng)過一系列異常處理后會調(diào)用 Array.SortT>(this._items, index, count, comparer); this._items是把List內(nèi)容轉(zhuǎn)換成數(shù)組,同樣再經(jīng)歷一些列異常處理,調(diào)用方法 ArraySortHelperT>.Default.Sort(array, index, length, comparer); 再往里就和我們上面寫的方法大同小異了,只不過微軟加了很多異常處理和算法優(yōu)化。

策略模式

看清楚了上面這個例子我們就可以進入正題,說說我們的策略模式了。策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

這個模式涉及到三個角色:

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

相信大家可以分方便的把我們上面例子中的類對應(yīng)上策略模式的角色,IComparer接口是我們的抽象策略角色, ListTestT> 類持有抽象策略的引用是環(huán)境(在Sort方法中,其實可以把接口定義為類的屬性,在構(gòu)造函數(shù)中賦值,不過不適合此場景,畢竟并不是所有List都需要排序,不能強制其接受一個可能會用不到的接口,當然對每個實例都需要用某個策略的場景是合適的),毫無疑問我們實現(xiàn)IComparer抽象策略的類就是具體策略。

使用場景

策略模式很容易理解,不過能夠用它很好的理解封裝變化和針對接口編程者兩個面向?qū)ο笤O(shè)計原則,我們來看看什么時候我們會用策略模式

1、 多個類只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。

2、 需要在不同情況下使用不同的策略(算法),這些策略有統(tǒng)一接口。

3、 對客戶隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立。

策略模式的優(yōu)勢和不足

優(yōu)點:

1、 提供了一種替代繼承的方法,而且既保持了繼承的優(yōu)點(代碼重用)還比繼承更靈活(算法獨立,可以任意擴展)。

2、 使用組合,避免程序中使用多重條件轉(zhuǎn)移語句,使系統(tǒng)更靈活,并易于擴展。

3、 遵守大部分GRASP原則和常用設(shè)計原則,高內(nèi)聚、低偶合。

缺點:

1、 因為每個具體策略類都會產(chǎn)生一個新類,所以會增加系統(tǒng)需要維護的類的數(shù)量。

您可能感興趣的文章:
  • Asp.Net設(shè)計模式之單例模式詳解
  • C#設(shè)計模式之Template模板方法模式實現(xiàn)ASP.NET自定義控件 密碼強度檢測功能
  • ASP.NET的適配器設(shè)計模式(Adapter)應(yīng)用詳解
  • jQuery 驗證插件 Web前端設(shè)計模式(asp.net)
  • .net設(shè)計模式之裝飾模式(Decorator)

標簽:百色 周口 朝陽 喀什 新鄉(xiāng) 臺州 洛陽 朔州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《關(guān)于.NET Framework中的設(shè)計模式--應(yīng)用策略模式為List排序》,本文關(guān)鍵詞  關(guān)于,.NET,Framework,中的,設(shè)計模式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《關(guān)于.NET Framework中的設(shè)計模式--應(yīng)用策略模式為List排序》相關(guān)的同類信息!
  • 本頁收集關(guān)于關(guān)于.NET Framework中的設(shè)計模式--應(yīng)用策略模式為List排序的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    午夜精品www| 国产极品粉嫩福利姬萌白酱| 开心激情五月婷婷| 国产精品成人aaaaa网站| 色哟哟入口国产精品| 国精产品久拍自产在线网站| www.天堂在线| 国产精品视频分类| 日本一区二区免费电影| 亚洲日韩中文字幕在线播放| 一区二区三区波多野结衣在线观看| 一区二区中文字幕| 日韩中文字幕网址| 国产日韩在线观看一区| 桃乃木かなav在线播放| 国产精品亚洲欧美在线播放| 正义之心1992免费观看全集完整版| 精品国产中文字幕第一页| 在线观看黄色av网站| 国产传媒欧美日韩成人精品大片| 国产精品4hu.www| 欧美视频在线不卡| 国产99精品视频| 中文字幕第一页在线播放| 91av在线免费| 亚洲激情视频一区| av成人在线电影| 国产精品12p| 性欧美极品另类| 性欧美极品xxxx欧美一区二区| 国产精品入口免费视频一| 国产精品久一| 国产91麻豆视频| 欧美精品啪啪| 久久精品亚洲国产奇米99| 欧美图片一区二区| 成人动漫一区二区三区| 国产 欧美 日韩 一区| 精品国产二区三区| 亚洲毛片在线观看.| 美女的奶胸大爽爽大片| 欧美在线免费播放| 丁香六月婷婷综合| 男人天堂2020| 一区二区三区视频免费视频观看网站| 成人黄色国产精品网站大全在线免费观看| 欧美视频在线一区二区三区| 久久99亚洲热视| gogo高清午夜人体在线| 亚洲综合社区| 久久爱av电影| 最近日韩中文字幕| 欧美精品在线网站| 一区二区三区四区| 欧美综合一区二区三区| 免费一级suv好看的国产网站| 夜夜嗨一区二区| 日韩欧美一区二区视频| 国产精品亚洲人成在99www| 久久久久青草大香线综合精品| 欧美自拍视频在线观看| 久久 天天综合| www.我爱av| 国产精品一区二区免费福利视频| 中文字幕人妻色偷偷久久| 亚洲精品视频免费观看| 一区二区免费在线播放| 伊人久久大香| 国产高清视频免费观看| 天天干天天骑| 日韩国产欧美一区二区三区| 久久人妻免费视频| 中文字幕123| 欧美做受xxxxxⅹ性视频| 国产精品三级久久久久久电影| 久久gogo国模啪啪裸体| 久久亚洲国产成人精品无码区| 六月丁香综合| 人妻无码久久一区二区三区免费| 国产特级黄色大片| 精品人妻午夜一区二区三区四区| 日韩成人久久| 精品理论电影| 日韩免费在线观看av| 日本肉体xxxx裸体784大胆| 国产精品久久久久影院色老大| 亚洲一区视频在线| 四虎国产精品成人永久免费影视| 精品国产黄a∨片高清在线| 国产精品视频自在线| 亚洲激情一二三区| 日本欧美在线视频免费观看| 国产高清自拍视频| 欧美日韩激情视频| www五月天com| 一区国产精品视频| 国产91精品一区二区| 精品伊人久久大线蕉色首页| 国产蜜臀av在线一区二区三区| 国产精品色呦呦| 欧美午夜aaaaaa免费视频| 亚洲区免费视频| 在线成人激情| 国产成人综合在线视频| 欧美一级午夜免费电影| 欧美高清在线播放| 婷婷五月色综合| 99久久久国产精品美女| 欧美激情一区二区三区久久久| 偷拍25位美女撒尿视频在线观看| 久久久国产亚洲精品| 99精品在线视频观看| 欧美精品一区二区在线观看| 国产一区二区三区日韩欧美| 四虎国产精品成人免费入口| 中文字幕av高清片| 高清在线不卡av| 国产精品成人免费一区久久羞羞| 精品性高朝久久久久久久| 亚洲免费av电影| 中文日本在线观看| 久久精品亚洲麻豆av一区二区| 日韩欧美在线视频免费观看| 中文字幕久热精品视频免费| 成人在线免费视频| 五月天六月丁香| 免费男女羞羞的视频网站在线观看| 久久精品无码一区| 成人jjav| 成人综合日日夜夜| 日本一级黄色录像| 国产一区二区三区四区二区| 欧美精品生活片| 一本一本久久a久久精品综合麻豆| 免费观看不卡av| 日韩欧美精品综合| 亚洲综合视频网站| 国产精品亚洲第一区在线暖暖韩国| 欧美在线视频免费| 欧美另类暴力丝袜| 久热精品视频在线观看| 久久大综合网| 快色在线观看| 国产精品国精产品一二| 五月天久久777| 日本美女在线中文版| 欧美深深色噜噜狠狠yyy| 久久久99精品免费观看不卡| 麻豆国产原创| 天堂精品视频| 黄色三级生活片| 山东少妇露脸刺激对白在线| 精品无码av一区二区三区不卡| 国产精品网站导航| 国产91久久久久蜜臀青青天草二| 亚洲第一综合网站| 国产精品自在线拍| 男人皇宫亚洲男人2020| 日本高清视频www| 99久久人妻无码精品系列| 一区二区三区视频播放| 深夜福利日韩在线看| 自拍av一区二区三区| 久久电影网站中文字幕| 亚洲国产一区二区在线播放| 四虎免费在线观看| 久久这里精品| 日本亚洲欧美成人| 欧美日韩高清在线播放| 精品无码国产一区二区三区51安| 91九色精品国产一区二区| 日韩成人一区二区| 天堂av一区| 国产精品夜间视频香蕉| 国产精品久久99| 欧美日本国产在线| 欧洲性视频在线播放| 在线观看免费视频国产| 欧美区在线观看| 久久久久国产精品一区三寸| 欧美一区二区少妇| 91麻豆精品国产综合久久久久久| 艳妇乳肉亭妇荡乳av| 精品免费一区二区三区| 国产欧美日韩综合精品一区二区三区| 手机在线播放av| 精品久久久99| 久久毛片高清国产| 久草视频在线观| 婷婷中文字幕综合| 久久综合狠狠综合| 亚洲欧洲www| 青青久在线视频| 亚洲免费影视第一页| 91精品在线免费| 日本免费黄色网| 美女av网站| 国产精品草莓在线免费观看| 精品视频在线观看免费| 在线成人激情视频| 欧美精品一卡| 欧美丝袜自拍制服另类| 可以直接看的黄色网址| 午夜3点看的视频| 精品亚洲精品福利线在观看| 日韩欧美精品在线观看| 91av视频在线播放| 少妇一级淫片免费看| 狠狠狠狠狠狠狠| 中文字幕av网| 欧美一区二视频| 中文字幕精品一区二区三区精品| 亚洲1区2区3区4区| 人妻互换一二三区激情视频| 9.1人成人免费视频网站| 独立日3在线观看完整版| 国产黑丝在线视频| 免费观看91视频大全| 亚洲精品粉嫩美女一区| 羞羞小视频视频| 日韩欧美中文字幕制服| 天堂社区 天堂综合网 天堂资源最新版| 少妇精品视频一区二区| 韩日毛片在线观看| 久9久9色综合| 偷偷看偷偷操| 欧美午夜性春猛xxxx| 亚洲精品小视频| www.嫩草免费在线观看| 欧美精品自拍视频| 国产精品久久久久久久乖乖| 成片免费观看视频| 国产精品嫩草影院久久久| 99riav国产精品| 天天插综合网| 国内精品视频在线观看| 日韩午夜黄色| av永久免费观看| 最新日本在线观看| 葵司免费一区二区三区四区五区| 国产丝袜一区二区三区| 99久久精品费精品国产| 亚洲色图100p| 黄色片在线观看网站| 欧美视频一区二| 欧美一二区在线观看| 亚洲少妇第一页| 精品美女被调教视频大全网站| 国产在线一区二区三区| 久青草国产在线| 一区二区国产精品| 全部孕妇毛片丰满孕妇孕交| 伦伦影院午夜理论片| 亚洲娇小xxxx欧美娇小| 国产精品自产拍高潮在线观看| 久久精品亚洲精品国产欧美kt∨| 在线观看日本视频| 天堂精品高清1区2区3区| 国产日韩欧美在线播放不卡| 色综合久综合久久综合久鬼88| 成人涩涩视频| 天天操天天干天天插| 高清精品久久| 好看的av在线| 国产无遮挡在线观看| 伊人男人综合视频网| 欧美成人a∨高清免费观看| 人妻精品久久久久中文| 久久www免费人成精品| 精品人妻一区二区三区日产| 琪琪一区二区三区| 三上悠亚在线一区二区| 国产深夜福利| 亚洲性视频大全| 91综合视频| 国产女人18毛片水真多| 亚洲av无码一区二区三区网址| a免费在线观看| 牛牛视频精品一区二区不卡| 国产精品久久久一区| 日韩av资源在线播放| 久久久精品久久久久特色影视| 精品国产中文字幕第一页| 亚洲小说区图片区情欲小说| www.日本在线播放| 999热精品视频| 国产一区二区三区四区五区传媒| www.中文字幕久久久| 九九热最新视频//这里只有精品| 在线免费观看av影视天堂| 久久精品高清| 久久青青草视频| 亚洲黄色a级片| 麻豆国产精品va在线观看不卡| 天堂av2020| 日本不卡一二三区黄网| 两个人的视频www国产精品| 爱看av在线| 狠狠v欧美v日韩v亚洲ⅴ| 夜夜嗨av一区二区三区免费区| 四虎久久影院| 成人午夜淫片100集| 富二代精品短视频| 美女精品网站| 久久黄色av网站| 亚洲欧美在线不卡| 国产精品一区二区三区在线| 在线国产一级| 美女在线不卡| 99国产在线播放| 91福利视频导航| av在线1区2区| 国产精品久久免费视频| 国产精品中文字幕欧美| 最新理论片影院| 欧美欧美欧美| 国产成人在线免费视频| bt天堂新版中文在线地址| 欧美中文字幕在线| 黑人巨大精品欧美一区| 国产视频精品在线| 亚洲成人一区在线| 日韩欧美极品在线观看| 亚洲奶水xxxx哺乳期| 狠狠爱免费视频| 国产一区在线电影| 亚洲精品免费视频| 狠狠色丁香婷婷综合影院|