亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java設(shè)計(jì)模式之策略模式詳細(xì)解析

 更新時(shí)間:2023年11月30日 10:14:55   作者:啊幾  
這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式詳細(xì)解析,策略模式中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨(dú)立于使用算法的客戶,需要的朋友可以參考下

策略模式基本介紹

策略模式(Strategy Pattern)中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨(dú)立于使用算法的客戶。

算法體現(xiàn)的設(shè)計(jì)原則:

  • 把變化的代碼從不變的代碼中分離出來
  • 針對(duì)接口編程而不是具體類(定義了策略接口)
  • 多用組合/聚合,少用繼承(通過使用組合方式使用策略模式)

策略模式實(shí)例

例如一個(gè)支付折扣服務(wù),根據(jù)會(huì)員的不同等級(jí)進(jìn)行不同的折扣,初級(jí)會(huì)員打9折,中級(jí)會(huì)員打8折,高級(jí)會(huì)員打7折

會(huì)員接口

public interface Member {

    public void discount();
}

三個(gè)不同等級(jí)會(huì)員實(shí)現(xiàn)類

public class JuniorMember implements Member{
    @Override
    public void discount() {
        System.out.println("初級(jí)會(huì)員打9折");
    }
}
public class AssociateMember implements Member{
    @Override
    public void discount() {
        System.out.println("中級(jí)會(huì)員打8折");
    }
}
public class SeniorMember implements Member{
    @Override
    public void discount() {
        System.out.println("高級(jí)會(huì)員打7折");
    }
}

傳統(tǒng)模式

折扣服務(wù)類

public class DiscountService {
    Member member;
    public void payment(MemberType memberType){
        if(memberType==MemberType.JUNIOR){
            member = new JuniorMember();
            member.discount();
        }else if(memberType==MemberType.ASSOCIATE){
            member = new AssociateMember();
            member.discount();
        } else if (memberType==MemberType.SENIOR) {
            member = new SeniorMember();
            member.discount();
        }
    }
}

enum MemberType{
    ASSOCIATE,
    JUNIOR,
    SENIOR
}

客戶端類

public class Client {
    public static void main(String[] args){
        DiscountService discountService = new DiscountService();
        System.out.println("--------------使用傳統(tǒng)模式--------------");
        discountService.payment(MemberType.SENIOR);
        discountService.payment(MemberType.ASSOCIATE);
        discountService.payment(MemberType.JUNIOR);
    }
}
/**
 * --------------使用傳統(tǒng)模式--------------
 * 高級(jí)會(huì)員打7折
 * 中級(jí)會(huì)員打8折
 * 初級(jí)會(huì)員打9折
 */

雖然可以用if else 滿足需求,但是不滿足開閉原則(對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉),如果新增會(huì)員類型,或者下架原有會(huì)員類型,要對(duì)折扣服務(wù)類進(jìn)行修改,擴(kuò)展性很差??梢妭鹘y(tǒng)模式弊端十分大。

策略模式

折扣服務(wù)類

public class DiscountService {
    Member member;

    DiscountService(Member member){
        this.member = member;
    }

    public void setMember(Member member) {
        this.member = member;
    }

    public void payment(){
        member.discount();
    }
}

客戶端類

public class Client {
    public static void main(String[] args) {
        System.out.println("------------使用策略模式------------");
        DiscountService discountService = new DiscountService(new JuniorMember());
        discountService.payment();
        discountService.setMember(new AssociateMember());
        discountService.payment();
        discountService.setMember(new SeniorMember());
        discountService.payment();
    }
}
/**
 * ------------使用策略模式------------
 * 初級(jí)會(huì)員打9折
 * 中級(jí)會(huì)員打8折
 * 高級(jí)會(huì)員打7折
 */

這里將Menber策略接口作為參數(shù)組合到折扣服務(wù)類,不需要寫復(fù)雜的 if else,滿足開閉原則,增加新的會(huì)員類,折扣服務(wù)類也不需要修改,并且對(duì)其他會(huì)員折扣的業(yè)務(wù)邏輯不會(huì)造成影響

JDK中使用策略模式的例子

在JDK中Arrays類中,sort(T[] a, Comparator<? super T> c)方法就是使用了策略模式,Comparator就是一個(gè)策略接口,方法中傳入了一個(gè)具體的排序策略實(shí)現(xiàn)類,根據(jù)不同的排序策略,進(jìn)行不同方式的排序

在這里插入圖片描述

使用場(chǎng)景

  • 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
  • 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
  • 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。

到此這篇關(guān)于Java設(shè)計(jì)模式之策略模式詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb開發(fā)入門第一篇必備知識(shí)講解

    JavaWeb開發(fā)入門第一篇必備知識(shí)講解

    JavaWeb開發(fā)入門第一篇主要內(nèi)容介紹的是必備知識(shí)、基礎(chǔ)知識(shí)、搭建JavaWeb應(yīng)用開發(fā)環(huán)境,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Java Mail與Apache Mail發(fā)送郵件示例

    Java Mail與Apache Mail發(fā)送郵件示例

    這篇文章主要介紹了Java Mail與Apache Mail發(fā)送郵件示例的相關(guān)資料,需要的朋友可以參考下
    2014-10-10
  • Java多線程中的CountDownLatch解析

    Java多線程中的CountDownLatch解析

    這篇文章主要介紹了Java多線程中的CountDownLatch解析,CountDownLatch是一個(gè)阻塞部分線程直到其他線程執(zhí)行完成后喚醒的同步計(jì)數(shù)器,核心是其內(nèi)部類Sync繼承于AQS,同時(shí)也是利用的AQS的同步原理,也稱之為閉鎖,需要的朋友可以參考下
    2023-11-11
  • java中的移位運(yùn)算符心得總結(jié)

    java中的移位運(yùn)算符心得總結(jié)

    這篇文章介紹了java中的移位運(yùn)算符,有需要的朋友可以參考一下
    2013-11-11
  • Java網(wǎng)絡(luò)IO模型詳解(BIO、NIO、AIO)

    Java網(wǎng)絡(luò)IO模型詳解(BIO、NIO、AIO)

    Java支持BIO、NIO和AIO三種網(wǎng)絡(luò)IO模型,BIO是同步阻塞模型,適用于連接數(shù)較少的場(chǎng)景,NIO是同步非阻塞模型,適用于處理多個(gè)連接,支持自JDK1.4起,AIO是異步非阻塞模型,適用于異步操作多的場(chǎng)景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Struts2.5版本struts.xml與web.xml配置的更改方法

    Struts2.5版本struts.xml與web.xml配置的更改方法

    這篇文章主要給大家介紹了關(guān)于Struts2.5版本中struts.xm與web.xml配置的更改方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 關(guān)于java的九個(gè)預(yù)定義Class對(duì)象

    關(guān)于java的九個(gè)預(yù)定義Class對(duì)象

    這篇文章主要介紹了關(guān)于java的九個(gè)預(yù)定義Class對(duì)象,在Java中,沒有類就無法做任何事情。然而,并不是所有的類都具有面向?qū)ο筇卣?。如Math.random,并只需要知道方法名和參數(shù),需要的朋友可以參考下
    2023-05-05
  • java+vue實(shí)現(xiàn)添加單選題、多選題到題庫功能

    java+vue實(shí)現(xiàn)添加單選題、多選題到題庫功能

    這篇文章主要為大家詳細(xì)介紹了java+vue實(shí)現(xiàn)添加單選題、多選題到題庫功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 深入解析Spring中的立即加載和延遲加載

    深入解析Spring中的立即加載和延遲加載

    本文介紹了Spring框架中的立即加載和延遲加載策略,并解釋了它們的適用場(chǎng)景和使用方法,根據(jù)具體的需求和應(yīng)用場(chǎng)景,選擇合適的加載策略,可以提高應(yīng)用程序的性能和資源利用效率,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • springboot集成RocketMQ過程及使用示例詳解

    springboot集成RocketMQ過程及使用示例詳解

    這篇文章主要為大家介紹了springboot集成RocketMQ過程及使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論