使用策略模式和多態(tài)去掉if/else、switch

很多時(shí)候我們會(huì)在代碼中使用很笨矬的if/else、switch語(yǔ)句,代碼閱讀起來(lái)相當(dāng)?shù)某粤?。有沒(méi)有一種方式可以替換呢。今天就讓我們看看強(qiáng)大策略模式如何解決這一問(wèn)題吧。

if/else示例

學(xué)生類(lèi)(student)

package com.zhanghf.noifelse;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Created by Administrator on 2017/4/9.
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private Achievement achievement;

    /**
     * 獲取學(xué)生成績(jī)
     *
     * @return 成績(jī)
     */
    public String getAchievement() {
        if (this.achievement == Achievement.A) {
            return "學(xué)生成績(jī)?yōu)?A";
        } else if (this.achievement == Achievement.B) {
            return "學(xué)生成績(jī)?yōu)?B";
        } else {
            return "學(xué)生成績(jī)?yōu)?C";
        }
    }
}

成績(jī)枚舉類(lèi)(Achievement)

package com.zhanghf.noifelse;

/**
 * Created by Administrator on 2017/4/9.
 */
public enum Achievement {
    A,B
}

方法測(cè)試類(lèi)(Application)

package com.zhanghf.noifelse;

/**
 * Created by Administrator on 2017/4/9.
 */
public class Application {

    public static void main(String[] args) {
        Student student = new Student(Achievement.B);
        System.out.println(student.getAchievement());
    }

}

可以看到在getAchievement方法中,使用了很多if/else if /else這樣的語(yǔ)句,下面我們先使用策略模式來(lái)替換。我們先來(lái)看看類(lèi)結(jié)構(gòu)(UML)。

策略模式.png

成績(jī)接口(Achievement)

package com.zhanghf.noifelse.strategy;

/**
 * Created by Administrator on 2017/4/9.
 */
public interface Achievement {
    String getAchievement();
}

優(yōu)秀成績(jī)類(lèi)(ExcellentAchievement)

package com.zhanghf.noifelse.strategy;

/**
 * Created by Administrator on 2017/4/9.
 */
public class ExcellentAchievement implements Achievement {

    public String getAchievement() {
        return "學(xué)生成績(jī)?yōu)?A";
    }
}

良好成績(jī)類(lèi)(GoodAchievement)

package com.zhanghf.noifelse.strategy;

/**
 * Created by Administrator on 2017/4/9.
 */
public class GoodAchievement implements Achievement {

    public String getAchievement() {
        return "學(xué)生成績(jī)?yōu)?B";
    }
}

及格成績(jī)類(lèi)(AverageAchievement)

package com.zhanghf.noifelse.strategy;

/**
 * Created by Administrator on 2017/4/9.
 */
public class AverageAchievement implements Achievement {

    public String getAchievement() {
        return "學(xué)生成績(jī)?yōu)?C";
    }
}

學(xué)生類(lèi)(Student)

package com.zhanghf.noifelse.strategy;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Created by Administrator on 2017/4/9.
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private Achievement achievement;

    public String getAchievement() {
        return this.achievement.getAchievement();
    }
}

代碼測(cè)試類(lèi)(Application)

package com.zhanghf.noifelse.strategy;


/**
 * Created by Administrator on 2017/4/9.
 */
public class Application {
    public static void main(String[] args) {
        Student student = new Student(new AverageAchievement());
        System.out.println(student.getAchievement());
    }
}

下面使用多態(tài)方式:

學(xué)生類(lèi)(student)

package com.zhanghf.noifelse.polymorphic;

import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Created by Administrator on 2017/4/9.
 */
@Data
@NoArgsConstructor
public class Student {

    public String getAchievement(AverageAchievement averageAchievement) {
        return averageAchievement.getAchievement();
    }

    public String getAchievement(ExcellentAchievement excellentAchievement) {
        return excellentAchievement.getAchievement();
    }

    public String getAchievement(GoodAchievement goodAchievement) {
        return goodAchievement.getAchievement();
    }

}

及格成績(jī)類(lèi)(AverageAchievement)

package com.zhanghf.noifelse.polymorphic;

/**
 * Created by Administrator on 2017/4/9.
 */
public class AverageAchievement{

    public String getAchievement() {
        return "學(xué)生成績(jī)?yōu)?C";
    }
}

良好成績(jī)類(lèi)(GoodAchievement)

package com.zhanghf.noifelse.polymorphic;

/**
 * Created by Administrator on 2017/4/9.
 */
public class GoodAchievement{

    public String getAchievement() {
        return "學(xué)生成績(jī)?yōu)?B";
    }
}

優(yōu)秀成績(jī)類(lèi)(ExcellentAchievement)

package com.zhanghf.noifelse.polymorphic;

/**
 * Created by Administrator on 2017/4/9.
 */
public class ExcellentAchievement {

    public String getAchievement() {
        return "學(xué)生成績(jī)?yōu)?A";
    }
}

代碼測(cè)試類(lèi)(Application)

package com.zhanghf.noifelse.polymorphic;

/**
 * Created by Administrator on 2017/4/9.
 */
public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        AverageAchievement averageAchievement = new AverageAchievement();
        System.out.println(student.getAchievement(averageAchievement));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,593評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,734評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,017評(píng)論 0 11
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,069評(píng)論 0 9
  • 現(xiàn)在坐在樂(lè)山到成都東的動(dòng)車(chē)上 說(shuō)起來(lái) 這是我第一次說(shuō)走就走的小短途 雖然還是熟悉的地方 但是與歸家這項(xiàng)目的終究是不...
    Sdesire_閱讀 241評(píng)論 0 0

友情鏈接更多精彩內(nèi)容