<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    午夜拍鍵驚奇
    子夜 編程 代碼與我同在
    posts - 48,comments - 118,trackbacks - 79

    “策略模式”的出現,是為了提供一套相互之間可靈活替換的算法,在不影響上層接口的情況下,用戶可以自由選擇不同的算法完成邏輯。

    策略模式的UML示意圖如下:?

    r_image002.jpg?

    ?其中算法的模型接口在“抽象策略”中定義,各具象策略實現不同的策略。“消費API”就是調用不同算法的類,在其內部根據不同需要選擇不同的算法。有時需要將具象策略實例化后再傳給其它類,這時可以使用“簡單工廠”(Simple Factory“工廠方法”(Factory Method生成所需的具象策略。下面就以我正在做的一個項目,簡化一下后說明一下策略模式的使用。

    該項目是一個小型的商業網站,邏輯層由Servlet實現。用戶有一個需求,需要從數據庫調出商品信息后能夠對記錄按名稱(name)、規格(standard)、價格(price)和注冊日期(register date)進行排序。雖然可以考慮按不同的排序關鍵字使用不同的sql語句(即不同的order by)查詢數據庫。但這樣做的網絡數據流量太大,每次需要從數據庫完整地取回一個數據集(ResultSet),所以我選擇了將數據集一次取到客戶端的一個List中,然后在客戶端按不同的關鍵字對List進行排序。

    java.util.Collections類中有一個public static void sort(List list, Comparator comparator)的方法,可以按照不同的Comparator對象對list進行排序,它使用的是快速排序,所以效率非常高。而java.util.Comparator是一個接口:

    ?

    package?java.util;

    public?abstract?interface?Comparator?{
    ??boolean?equals(Object?
    object);

    ??
    int?compare(Object?object,?Object?object1);
    }


    ?

    其中和排序有關的是compare方法,它返回一個整數,若第一個參數比第二個參數“大”,則返回一個正數,若“小”則返回一個負數,若“相等”則返回0,這里的“大”、“小”、“相等”是由compare方法具體實現定義的一種比較標準。由這個方法不禁想到C語言中qsort函數中使用的函數指針int *compare(*,*)JAVA中之所以沒有函數指針,就是用接口取代了(更詳細的介紹見《Effective Java》中第22條“用類和接口來代替函數指針”)。

    很明顯,Comparator接口就是我們的“抽象策略”,sort方法就是我們的“消費API”,而不同的“具象策略”就是我們從Comparator接口實現的根據不同關鍵字排序的類。

    整個排序模型的UML圖如下,其中為了作圖方便,我從Comparator繼承了一個接口ItemComparator,根據不同的關鍵字從ItemComparator接口泛化了NameComparator類,PriceComparator類,RegisterDateComparator類和StandardComparator類。實際運用中不需要這個接口,四個類可以直接從Comparator泛化。ItemBean是一個封裝了商品信息的beanList中存放的就是這些beanItemSortItemComparator以及四個具體類實現了“簡單工廠”模式,并封裝了sort方法。

    ?o_strategy.dfPackage.jpg?


    ??? 下面是具體的代碼(StandardComparator類的代碼與NameComparator類的代碼大同小異,在這里不列出):

    ?

    NameComparator類:

    ?

    package?com.lim.designpatterns.strategy;

    public?class?NameComparator?implements?ItemComparator{
    ??NameComparator()
    {}??//?將構造器封裝,包外的類欲得到Comparator實例只能通過簡單工廠

    ??
    public?int?compare(Object?o1,Object?o2){
    ????String?name1
    =((ItemBean)o1).getName();
    ????String?name2
    =((ItemBean)o2).getName();

    ????
    return?name1.compareTo(name2);??//?調用String的CompareTo方法
    ??}

    }

    ?

    PriceComparator

    ?

    package?com.lim.designpatterns.strategy;

    public?class?PriceComparator?implements?ItemComparator{
    ??PriceComparator()
    {}

    ??
    public?int?compare(Object?o1,Object?o2){
    ????Double?price1
    =new?Double(((ItemBean)o1).getPrice());
    ????Double?price2
    =new?Double(((ItemBean)o2).getPrice());

    ????
    return?price1.compareTo(price2);??//?調用Double的CompareTo方法
    ??}

    }

    ?

    RegisterDateComparator

    ?

    package?com.lim.designpatterns.strategy;

    import?java.util.
    *;

    public?class?RegisterDateComparator?implements?ItemComparator{
    ??RegisterDateComparator()
    {}

    ??
    public?int?compare(Object?o1,Object?o2){
    ????Date?date1
    =((ItemBean)o1).getRegisterDate();
    ????Date?date2
    =((ItemBean)o2).getRegisterDate();

    ????
    return?date1.compareTo(date2);??//?調用Date的CompareTo方法
    ??}

    }

    ?

    ItemSort

    ?

    package?com.lim.designpatterns.strategy;

    import?java.util.
    *;

    public?class?ItemSort{
    ??
    public?static?List?sort(List?items,ItemComparator?c){
    ????Collections.sort(items,c);
    ????
    return?items;
    ??}


    ??
    public?static?final?ItemComparator?NAME=new?NameComparator();??//?簡單工廠

    ??
    public?static?final?ItemComparator?PRICE=new?PriceComparator();

    ??
    public?static?final?ItemComparator?STANDARD=new?StandardComparator();

    ??
    public?static?final?ItemComparator?REG_DATE=new?RegisterDateComparator();
    }

    ?

    TestItemSort

    ?

    package?com.lim.designpatterns.strategy;

    import?java.util.
    *;

    public?class?TestItemSort{
    ??
    public?static?void?main(String[]?args){
    ????List?items
    =new?ArrayList();
    ????
    //?向List添加條目

    ????items
    =ItemSort.sort(items,ItemSort.NAME);??//?按名稱排序

    ????items
    =ItemSort.sort(items,ItemSort.PRICE);??//?按價格排序

    ????items
    =ItemSort.sort(items,ItemSort.REG_DATE);??//?按注冊日期排序

    ????items
    =ItemSort.sort(items,ItemSort.STANDARD);??//?按規格排序
    ??}

    }
    posted on 2005-08-04 12:37 ^ Mustang ^ 閱讀(1246) 評論(2)  編輯  收藏 所屬分類: Design Patterns

    FeedBack:
    # re: 使用策略模式(strategy pattern)實現多關鍵字排序
    2005-08-06 08:31 | 一竿殘照.金棣 @ blogJava.net
    恩,delphi中的TStringList有同樣的結構,受教,謝謝  回復  更多評論
      
    # re: 使用策略模式(Strategy)實現多關鍵字排序
    2006-08-28 17:08 | zhl
    I got it!
    3ks!  回復  更多評論
      
    主站蜘蛛池模板: 亚洲精品NV久久久久久久久久| 亚洲爽爽一区二区三区| 成人亚洲国产精品久久| 久久精品亚洲乱码伦伦中文| 无码人妻久久一区二区三区免费| 亚洲国产夜色在线观看| 全部免费毛片免费播放| 免费无码成人AV在线播放不卡| 亚洲综合一区无码精品| 国产L精品国产亚洲区久久| h视频在线观看免费网站| 免费看又黄又爽又猛的视频软件 | 亚洲午夜福利AV一区二区无码| 999国内精品永久免费视频| 西西人体大胆免费视频| 亚洲国产电影在线观看| 国产亚洲精久久久久久无码AV| av免费不卡国产观看| 一出一进一爽一粗一大视频免费的| 亚洲日本在线观看网址| 亚洲综合熟女久久久30p| 好吊妞视频免费视频| 午夜视频免费在线观看| 永久免费无码日韩视频| 自拍日韩亚洲一区在线| 国产成人精品日本亚洲| 国产又黄又爽又刺激的免费网址 | 一级成人毛片免费观看| 亚洲校园春色另类激情| 国产aⅴ无码专区亚洲av| 免费国产在线观看不卡| 很黄很色很刺激的视频免费| 成人性生交大片免费看好| 国产成人亚洲毛片| 亚洲人成综合网站7777香蕉| 亚洲AV日韩AV永久无码久久| 亚洲片一区二区三区| 日本a级片免费看| 黄瓜视频影院在线观看免费| 亚洲一区免费视频| 日韩免费无码视频一区二区三区|