成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

策略模式

曹金海 / 2803人閱讀

摘要:今天和大家分享一下設(shè)計(jì)模式中的策略模式,這里只是分享樓主自己的見解,如有考慮不恰當(dāng)?shù)牡胤?,還請(qǐng)理解,那么我們言歸正傳。那怎么辦呢,答案你懂的,就是用策略模式。

今天和大家分享一下設(shè)計(jì)模式中的策略模式,這里只是分享樓主自己的見解,如有考慮不恰當(dāng)?shù)牡胤?,還請(qǐng)理解,那么我們言歸正傳。由于樓主自己工作的原因,常常需要將數(shù)據(jù)庫(kù)中資源數(shù)據(jù)生成相應(yīng)的靜態(tài)化文件(json文件),也就是俗稱的打包,來(lái)給前端調(diào)用。資源數(shù)據(jù)可能有很多種類型。例如:新聞、電影、小說(shuō)、動(dòng)漫、游戲等。不同的類型,在打包時(shí),可能有不一樣的流程,例如新聞和電影就有很大的不同,新聞在打包時(shí),除了基本的流程外,還需要有上傳功能,也就是自動(dòng)下發(fā),因?yàn)樾侣劦膶?shí)效性要求很高。但電影就不需要有此功能,因?yàn)榇虬募?,不能自?dòng)下發(fā),需人工審批。下面我們按照上面的需求用一般的思維來(lái)設(shè)計(jì)我們相關(guān)的類。

按照需求我們需要一個(gè)接口來(lái)定義我們打包的所有方法,然后我們?yōu)樵摻涌趧?chuàng)建相應(yīng)的實(shí)現(xiàn)類將公共的可以復(fù)用的方法封裝到這個(gè)實(shí)現(xiàn)類中,將每個(gè)模塊特有的方法放到它的子類里去自己實(shí)現(xiàn)。下面為具體的代碼:

/**
 * 定義所有打包的流程
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 10:45
 * @since 1.0.0
 */
public interface Staticize {

    /**
     * 初始化 如:創(chuàng)建相應(yīng)文件夾、定義一些打包參數(shù)等
     */
    void doInit();

    /**
     * 獲取數(shù)據(jù)庫(kù)資源數(shù)據(jù)
     */
    void findStaticData();

    /**
     * 獲取相應(yīng)的資源 如 圖片、音頻等
     */
    void doGetRes();

    /**
     * 將生成的資源包打包ZIP文件
     */
    void doZip();

    /**
     * 將ZIP文件自動(dòng)下發(fā) (只有新聞?dòng)写肆鞒蹋?     */
    void doUpload();
}
/**
 * 公共流程方法實(shí)現(xiàn)
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:11
 * @since 1.0.0
 */
public class DetailStaticize implements Staticize {
    public void doInit() {
        System.out.println("初始化成功");
    }

    public void findStaticData() {
        System.out.println("獲取新聞資源數(shù)據(jù)成功");
        System.out.println("獲取電影資源數(shù)據(jù)成功");
    }

    public void doGetRes() {
        System.out.println("獲取相應(yīng)的資源成功");
    }

    public void doZip() {
        System.out.println("ZIP創(chuàng)建成功");
    }

    public void doUpload() {
    }
}
/**
 * 新聞特有流程方法處理
 * 
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:13
 * @since 1.0.0
 */
public class NewsStaticize extends DetailStaticize {

    @Override
    public void findStaticData() {
        System.out.println("獲取新聞資源數(shù)據(jù)成功");
    }

    @Override
    public void doUpload() {
        System.out.println("新聞自動(dòng)下發(fā)成功");
    }
}
/**
 * 電影特有流程方法處理
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:13
 * @since 1.0.0
 */
public class VideoStaticize extends DetailStaticize {
    @Override
    public void findStaticData() {
        System.out.println("獲取電影資源數(shù)據(jù)成功");
    }

    @Override
    public void doUpload() {
    }
}

下面為測(cè)試結(jié)果 調(diào)用默認(rèn)接口實(shí)現(xiàn):

/**
 * 測(cè)試類
 * 
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new DetailStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.doUpload();
    }
}

結(jié)果為:

初始化成功
獲取新聞資源數(shù)據(jù)成功
獲取電影資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功

調(diào)用新聞實(shí)現(xiàn):

/**
 * 測(cè)試類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new NewsStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.doUpload();
    }
}

結(jié)果為:

初始化成功
獲取新聞資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功
新聞自動(dòng)下發(fā)成功
調(diào)用電影實(shí)現(xiàn):
/**
 * 測(cè)試類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new VideoStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.doUpload();
    }
}

結(jié)果為:

初始化成功
獲取電影資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功

按照?qǐng)?zhí)行結(jié)果來(lái)看,似乎實(shí)現(xiàn)了我們的需求。但有一點(diǎn)需要注意就是我們的子類里會(huì)有一些空實(shí)現(xiàn),也就是電影子類重寫父類的upload()方法。如果我們的另一個(gè)模塊,例如 綜藝模塊,由于資源也是比較大的,不需要自動(dòng)下發(fā),那我們也要在此模塊中添加upload方法的空實(shí)現(xiàn),可能有些人認(rèn)為,只是一個(gè)空實(shí)現(xiàn),沒啥大不了的,畢竟什么也沒有寫嗎。但是,如果需求變了,需要電影或者綜藝等沒有自動(dòng)下發(fā)功能的模塊當(dāng)ZIP文件生成成功時(shí)自動(dòng)發(fā)郵件通知運(yùn)營(yíng)手動(dòng)拷貝呢,這時(shí)我們就要在這個(gè)upload()方法里添加具體的發(fā)送郵件代碼了,并且這兩個(gè)模塊的業(yè)務(wù)邏輯完全相同的,這就造成了代碼的重復(fù),不能復(fù)用。這時(shí),可能用人還會(huì)說(shuō),我可以寫一個(gè)工具類來(lái)處理發(fā)送郵件的需求。這樣就解決了,代碼重復(fù),不能復(fù)用的問題。這樣當(dāng)然可以,但是還有一點(diǎn)別忘了,就是調(diào)用發(fā)送郵件的方法還是要寫在每一個(gè)具體的子類中,這個(gè)當(dāng)工具類做某些修改,那么和它有關(guān)的所有的調(diào)用類都要做出相應(yīng)修改,這就顯然也不是最好的解決方案。

那怎么辦呢,答案你懂的,就是用策略模式。那什么是策略模式呢?

策略模式的定義:定義了算法組,分別封裝起來(lái),讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。

按照設(shè)計(jì)模式的基本原則之一:找出應(yīng)用中可能變化之處,把它們獨(dú)立出來(lái),不要和那些不需要變化的代碼混在一起。也就是說(shuō),我們需要將接口中需要變化的地方提取出來(lái)。按照我們的需求也就是需要將upload()方法提取出來(lái)。那怎么提取呢,是提取成接口還是提取成一個(gè)多帶帶的類?這個(gè)還有一個(gè)設(shè)計(jì)模式的原則就是:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。這句話的意思是:我們知道一個(gè)接口可以有很多個(gè)實(shí)現(xiàn)類,至于一共有哪些實(shí)現(xiàn)類,接口是不需要知道的,調(diào)用時(shí)只要實(shí)例化這個(gè)實(shí)現(xiàn)類并指向該接口就可執(zhí)行調(diào)用,如果有新的實(shí)現(xiàn)類,只要新實(shí)例化這個(gè)新類即可,對(duì)接口方法的調(diào)用沒有改變,這樣就很方便擴(kuò)展。

回到我們的需求上,我們需要將upload抽取成一個(gè)接口,然后為了它創(chuàng)建兩個(gè)實(shí)現(xiàn)類,一個(gè)為自動(dòng)下發(fā)實(shí)現(xiàn),一個(gè)為不需要自動(dòng)下發(fā)實(shí)現(xiàn)。具體代碼如下:

/**
 * 下發(fā)接口
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 11:06
 * @since 1.0.0
 */
public interface UploadStaticize {
    void upload();
}
/**
 * 自動(dòng)下發(fā)接口實(shí)現(xiàn)
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 13:26
 * @since 1.0.0
 */
public class DefalutUploadStaticize implements UploadStaticize {
    public void upload() {
        System.out.println("upload");
    }
}
/**
 * 不需要自動(dòng)下發(fā)接口實(shí)現(xiàn)
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 13:27
 * @since 1.0.0
 */
public class DefalutUnUploadStaticize implements UploadStaticize {
    public void upload() {
        System.out.println("un upload");
    }
}

DefaultStaticize實(shí)現(xiàn)類修改如下:

/**
 * 公共流程方法實(shí)現(xiàn)
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:11
 * @since 1.0.0
 */
public class DetailStaticize implements Staticize {

    UploadStaticize uploadStaticize = new DefalutUnUploadStaticize();

    public void doInit() {
        System.out.println("初始化成功");
    }

    public void findStaticData() {
        System.out.println("獲取新聞資源數(shù)據(jù)成功");
        System.out.println("獲取電影資源數(shù)據(jù)成功");
    }

    public void doGetRes() {
        System.out.println("獲取相應(yīng)的資源成功");
    }

    public void doZip() {
        System.out.println("ZIP創(chuàng)建成功");
    }

    public void doUpload() {
        uploadStaticize.upload();
    }
}

NewsStaticize實(shí)現(xiàn)類修改如下:

/**
 * 新聞特有流程方法處理
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:13
 * @since 1.0.0
 */
public class NewsStaticize extends DetailStaticize {

    public NewsStaticize() {
        uploadStaticize = new DefalutUploadStaticize();
    }

    @Override
    public void findStaticData() {
        System.out.println("獲取新聞資源數(shù)據(jù)成功");
    }
}

測(cè)試類代碼未修改:新聞模塊

/**
 * 測(cè)試類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new NewsStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.doUpload();
    }
}

測(cè)試結(jié)果:

初始化成功
獲取新聞資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功
upload

電影模塊:

/**
 * 測(cè)試類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new VideoStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.doUpload();
    }
}

測(cè)試結(jié)果:

初始化成功
獲取電影資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功
un upload

這樣寫有有什么好處呢,就是方便擴(kuò)展,如我上面所說(shuō)如果需要將沒有自動(dòng)下發(fā)功能的模塊添加發(fā)送郵件通知功能,那么我們只需要新創(chuàng)建一個(gè)UploadStaticize的子類就可以了。對(duì)應(yīng)修改如下:

/**
 * 發(fā)送郵件實(shí)現(xiàn)類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 17:57
 * @since 1.0.0
 */
public class EmailUploadStaticize implements UploadStaticize {
    public void upload() {
        System.out.println("send email");
    }
}
/**
 * 電影特有流程方法處理
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:13
 * @since 1.0.0
 */
public class VideoStaticize extends DetailStaticize {
    public VideoStaticize() {
        uploadStaticize = new EmailUploadStaticize();
    }

    @Override
    public void findStaticData() {
        System.out.println("獲取電影資源數(shù)據(jù)成功");
    }

}

測(cè)試類代碼不變 ,輸入結(jié)果為:

初始化成功
獲取電影資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功
send email

結(jié)果似乎已經(jīng)很完美了,但你可能會(huì)發(fā)現(xiàn) ,就是我們改動(dòng)了VideoStaticize 這個(gè)類,這個(gè)是電影模塊的核心類,我們不能隨隨便便就修改已經(jīng)開發(fā)好的類,因?yàn)檫@樣就不是可擴(kuò)展易維護(hù)的程序了,并且這也不符合設(shè)計(jì)模式的基本原則。那什么辦法嗎,答案還是有的。就是我們讓客戶端可以設(shè)置,如果客戶端不設(shè)置那么程序就按照原先的邏輯執(zhí)行,如果設(shè)置了,就按照新設(shè)置的策略執(zhí)行。具體代碼如下:

Staticize接口新增setUploadStaticize()方法:

/**
 * 定義所有打包的流程
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 10:45
 * @since 1.0.0
 */
public interface Staticize {

    /**
     * 初始化 如:創(chuàng)建相應(yīng)文件夾、定義一些打包參數(shù)等
     */
    void doInit();

    /**
     * 獲取數(shù)據(jù)庫(kù)資源數(shù)據(jù)
     */
    void findStaticData();

    /**
     * 獲取相應(yīng)的資源 如 圖片、音頻等
     */
    void doGetRes();

    /**
     * 將生成的資源包打包ZIP文件
     */
    void doZip();

    /**
     * 將ZIP文件自動(dòng)下發(fā) (只有新聞?dòng)写肆鞒蹋?     */
    void doUpload();

    /**
     * 添加可以動(dòng)態(tài)設(shè)置UploadStaticize的方法
     *
     * @param uploadStaticzie
     */
    void setUploadStaticzie(UploadStaticize uploadStaticzie);
}

添加setUploadStaticize()方法具體的實(shí)現(xiàn):

/**
 * 公共流程方法實(shí)現(xiàn)
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:11
 * @since 1.0.0
 */
public class DetailStaticize implements Staticize {

    UploadStaticize uploadStaticize = new DefalutUploadStaticize();

    public void doInit() {
        System.out.println("初始化成功");
    }

    public void findStaticData() {
        System.out.println("獲取新聞資源數(shù)據(jù)成功");
        System.out.println("獲取電影資源數(shù)據(jù)成功");
    }

    public void doGetRes() {
        System.out.println("獲取相應(yīng)的資源成功");
    }

    public void doZip() {
        System.out.println("ZIP創(chuàng)建成功");
    }

    public void doUpload() {
        uploadStaticize.upload();
    }

    public void setUploadStaticzie(UploadStaticize uploadStaticzie) {
        this.uploadStaticize = uploadStaticzie;
    }
}

測(cè)試類代碼修改:

/**
 * 測(cè)試類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new NewsStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.setUploadStaticzie(new EmailUploadStaticize());
        staticize.doUpload();
    }
}

執(zhí)行結(jié)果:

初始化成功
獲取新聞資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功
send email

這樣程序就是一個(gè)可以擴(kuò)展易維護(hù)的程序了。例如 如果需求變更需要新聞模塊不但自動(dòng)下發(fā)還要發(fā)送郵件怎么辦呢。這時(shí)我們就不需要做任何開發(fā)了,只要客戶端自己調(diào)用就可以了。代碼如下:

/**
 * 測(cè)試類
 *
 * @author Sama
 * @author [email protected]
 * @date 2017-01-04 15:15
 * @since 1.0.0
 */
public class Test {
    @org.junit.Test
    public void test() {
        Staticize staticize = new NewsStaticize();
        staticize.doInit();
        staticize.findStaticData();
        staticize.doGetRes();
        staticize.doZip();
        staticize.doUpload();
        staticize.setUploadStaticzie(new EmailUploadStaticize());
        staticize.doUpload();
    }
}

執(zhí)行結(jié)果:

初始化成功
獲取新聞資源數(shù)據(jù)成功
獲取相應(yīng)的資源成功
ZIP創(chuàng)建成功
upload
send email

這就是我對(duì)設(shè)計(jì)模式中策略模式的理解 ,如本文有不正確之處,歡迎指出。謝謝。

原文地址:吉林烏拉

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66714.html

相關(guān)文章

  • Java設(shè)計(jì)模式-策略模式

    摘要:可以使用其他模式來(lái)修正這個(gè)缺陷,如工廠方法模式代理模式或享元模式。我們的策略模式只是實(shí)現(xiàn)了策略的管理,但是沒有嚴(yán)格地定義適當(dāng)?shù)膱?chǎng)景使用適當(dāng)?shù)牟呗?,在?shí)際項(xiàng)目中,一般通過(guò)工廠方法模式來(lái)實(shí)現(xiàn)策略類的聲明。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 Define a family of algorithms,encapsulate each one,and make them interchange...

    dabai 評(píng)論0 收藏0
  • 設(shè)計(jì)模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評(píng)論0 收藏0
  • 設(shè)計(jì)模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評(píng)論0 收藏0
  • 設(shè)計(jì)模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    MangoGoing 評(píng)論0 收藏0
  • 我的Java設(shè)計(jì)模式-策略模式

    摘要:孫臏心里一萬(wàn)個(gè)草泥馬在奔騰,差點(diǎn)沒噎死自己滾一邊去,我們這盤跟他賽馬開始,策略模式上場(chǎng)。在設(shè)計(jì)模式之禪中的提出通過(guò)策略枚舉和反射機(jī)制對(duì)策略模式進(jìn)行改良,膜拜了但是要添加或淘汰策略,還是得去對(duì)枚舉進(jìn)行修改,也不符合開閉原則。 今天給大家說(shuō)說(shuō)田忌賽馬的故事。如有雷同,純屬巧合!話說(shuō)在戰(zhàn)國(guó)時(shí)期,群雄割據(jù),硝煙四起,茶余飯后還是少不了娛樂活動(dòng)的,其中賽馬是最火爆的。一天,孫臏看到田忌像個(gè)死雞似...

    zilu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<