欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計(jì)模式之策略模式原理與用法實(shí)例詳解

 更新時(shí)間:2018年04月27日 09:05:12   作者:aronykl  
這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java策略模式的概念、原理、定義及使用方法,并總結(jié)了相關(guān)的優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Java設(shè)計(jì)模式之策略模式原理與用法。分享給大家供大家參考,具體如下:

策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。其中JDK里面的TreeSet類和TreeMap類就用到了策略模式。這兩個(gè)類是帶排序的集合類,其中排序的規(guī)則就相當(dāng)于策略模式里定義的一系列算法,而集合類就相當(dāng)于是策略模式里的環(huán)境類,供用戶使用,用只知道TreeSet和TreeMap是帶排序的,至于怎么排序的,是由排序的算法決定的。

策略模式由三部分組成:抽象策略角色,具體策略角色,環(huán)境角色。

抽象策略角色:策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn)。

具體策略角色:實(shí)現(xiàn)了抽象策略類,并包裝了相關(guān)的算法和行為。

環(huán)境角色:持有一個(gè)策略類的引用,最終給客戶端調(diào)用。

下面提供一個(gè)簡單的策略模式的代碼實(shí)例:

1.抽象策略角色:定義一個(gè)接口Strategy。

package com.test;
/**
 * 策略模式抽象角色
 * @author zhouwen
 *
 */
public interface Strategy {
  public int calculate(int a, int b);
}

2.具體策略角色:實(shí)現(xiàn)Strategy接口。例子中是實(shí)現(xiàn)加減乘除的運(yùn)算。

package com.test;
/**
 * 策略模式具體策略類
 * 實(shí)現(xiàn)加法運(yùn)算
 * @author zhouwen
 *
 */
public class AddStrategy implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a + b;
  }
}

package com.test;
/**
 * 策略模式具體策略類
 * 實(shí)現(xiàn)減法運(yùn)算
 * @author zhouwen
 *
 */
public class SubtractStrategy implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a - b;
  }
}

package com.test;
/**
 * 策略模式具體策略類
 * 實(shí)現(xiàn)乘法運(yùn)算
 * @author zhouwen
 *
 */
public class MultiplyStragety implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a * b;
  }
}

package com.test;
/**
 * 策略模式具體策略類
 * 實(shí)現(xiàn)除法運(yùn)算
 * @author zhouwen
 *
 */
public class DivideStrategy implements Strategy {
  @Override
  public int calculate(int a, int b) {
    return a / b;
  }
}

3.環(huán)境角色:在環(huán)境角色中定義一個(gè)抽象角色的引用,并暴露出計(jì)算的方法,供客戶端調(diào)用。

package com.test;
/**
 * 策略模式環(huán)境類
 * @author zhouwen
 *
 */
public class Environment {
  private Strategy strategy;
  public Environment(Strategy strategy){
    this.strategy = strategy;
  }
  //用以改變策略
  public void setStrategy(Strategy strategy){
    this.strategy = strategy;
  }
  public Strategy getStrategy(){
    return strategy;
  }
  //暴露計(jì)算的接口,供客戶端調(diào)用
  public int calculate(int a, int b){
    return strategy.calculate(a, b);
  }
}

4.最后編寫客戶端的代碼:

package com.test;
public class Client {
  public static void main(String[] args) {
    AddStrategy addStrategy = new AddStrategy();
    Environment environment = new Environment(addStrategy);
    System.out.println(environment.calculate(3, 4));
    SubtractStrategy subStrategy = new SubtractStrategy();
    environment.setStrategy(subStrategy);
    System.out.println(environment.calculate(3, 4));
    MultiplyStragety multiplyStrategy = new MultiplyStragety();
    environment.setStrategy(multiplyStrategy);
    System.out.println(environment.calculate(3, 4));
    DivideStrategy divideStrategy = new DivideStrategy();
    environment.setStrategy(divideStrategy);
    System.out.println(environment.calculate(3, 4));
  }
}

總結(jié):

由客戶端的System.out.println(environment.calculate(3, 4));這句代碼,我們并不知道具體調(diào)用的是哪個(gè)實(shí)現(xiàn)類,只有知道了傳給環(huán)境角色的具體策略類我們才知道調(diào)用哪個(gè)類,這樣就能實(shí)現(xiàn)客戶端和具體策略算法的分離,使程序易于切換、易于理解、易于擴(kuò)展。

策略模式的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

1.策略模式的用意是針對一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中,從而使得他們可以相互替換。如提供的例子中通過set方法對策略進(jìn)行替換。

2.策略模式使得算法可以在不影響客戶端的情況下發(fā)生變化。使用策略模式可以把行為和環(huán)境分隔開。

3.環(huán)境類負(fù)責(zé)維持和查詢行為類,各類算法則在具體策略中提供。由于算法和環(huán)境獨(dú)立開來,算法的修改不會(huì)影響環(huán)境和客戶端。

缺點(diǎn):

1.客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。

2.會(huì)造成很多的策略類。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • java 中RSA的方式實(shí)現(xiàn)非對稱加密的實(shí)例

    java 中RSA的方式實(shí)現(xiàn)非對稱加密的實(shí)例

    這篇文章主要介紹了java 中RSA的方式實(shí)現(xiàn)非對稱加密的實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家理解這部分知識(shí),需要的朋友可以參考下
    2017-08-08
  • java 如何將多種字符串格式 解析為Date格式

    java 如何將多種字符串格式 解析為Date格式

    這篇文章主要介紹了java 如何將多種字符串格式 解析為Date格式的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Mybatis防止sql注入的實(shí)例

    Mybatis防止sql注入的實(shí)例

    本文通過實(shí)例給大家介紹了Mybatis防止sql注入的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java?file類中renameTo方法操作實(shí)例

    Java?file類中renameTo方法操作實(shí)例

    renameTo()方法是File類的一部分,renameTo()函數(shù)用于將文件的抽象路徑名重命名為給定的路徑名??,下面這篇文章主要給大家介紹了關(guān)于Java?file類中renameTo方法操作的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    升級dubbo2.7.4.1版本平滑遷移到注冊中心nacos

    這篇文章主要為大家介紹了2.7.4.1的dubbo平滑遷移到注冊中心nacos的兩種版本升級方案,以及為什要升級,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • Struts2攔截器登錄驗(yàn)證實(shí)例

    Struts2攔截器登錄驗(yàn)證實(shí)例

    本篇文章主要介紹了Struts2攔截器登錄驗(yàn)證實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java實(shí)現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲(附源碼)

    Java實(shí)現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲(附源碼)

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java利用File類創(chuàng)建文件的示例代碼

    Java利用File類創(chuàng)建文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java中的File類創(chuàng)建文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 一文秒懂通過JavaCSV類庫讀寫CSV文件的技巧

    一文秒懂通過JavaCSV類庫讀寫CSV文件的技巧

    本文給大家推薦第三方工具庫 JavaCSV,用來造一些 csv 測試數(shù)據(jù)文件,使用超級方便,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 深入學(xué)習(xí)java中的Groovy 和 Scala 類

    深入學(xué)習(xí)java中的Groovy 和 Scala 類

    本文將探討三種下一代 JVM 語言:Groovy、Scala 和 Clojure,比較并對比新的功能和范例,讓 Java 開發(fā)人員對自己近期的未來發(fā)展有大體的認(rèn)識(shí)。,需要的朋友可以參考下
    2019-06-06

最新評論