策略模式概念:它定義了算法家族睛廊,分別封裝起來藐不,讓他們之前可以互相替換莉兰,此模式讓算法的變化浅乔,不會(huì)影響到使用算法的客戶倔喂。
業(yè)務(wù)場(chǎng)景:商場(chǎng)收銀軟件v1.0
需求1:做一個(gè)商場(chǎng)的收銀軟件,營業(yè)員根據(jù)客戶所購買的商品的數(shù)量和單價(jià)靖苇,向客戶收費(fèi)席噩。
代碼實(shí)現(xiàn):
package 策略模式;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double price = input.nextDouble();
int number = input.nextInt();
double sum = getSum(price,number);
System.out.println(sum);
}
private static double getSum(double price, int number) {
double result = 0.0;
result = price* number;
return result;
}
}
上述的代碼很簡(jiǎn)單,相信大家都能看懂贤壁,但是上面的代碼很難擴(kuò)展悼枢,比如我又有一個(gè)需求:現(xiàn)在我要求商場(chǎng)對(duì)商品搞活動(dòng),所有的商品打八折脾拆。
package 策略模式;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double price = input.nextDouble();
int number = input.nextInt();
//打折
double zhe = input.nextDouble();
double sum = getSum(price,number,zhe);
System.out.println(sum);
}
private static double getSum(double price, int number,double zhe) {
double result = 0.0;
result = price* number*zhe;
return result;
}
}
又來一個(gè)需求3:商場(chǎng)活動(dòng)力度要加大馒索,需要有滿三百返一百促銷算法。是不是又要修改代碼名船。我們可以用簡(jiǎn)單工廠模式來寫
package 策略模式;
public interface CashSuper {
public double acceptCash(double money);//收取現(xiàn)金绰上,參數(shù)為原價(jià),返回當(dāng)前價(jià)
}
package 策略模式;
/**
* 返利收費(fèi)子類
* @author admin
*
*/
public class CashReturn implements CashSuper{
private double moneyCondition = 0;
private double moneyReturn=0;
public CashReturn(double moneyCondition,double moneyReturn){//返利收費(fèi)渠驼,初始化時(shí)必須輸入返利條件和返回利值
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
public double acceptCash(double money) {
double result = money;
if (money >= moneyCondition) {
result = money-(money/moneyCondition)*moneyReturn;
}
return result;
}
}
package 策略模式;
/***
* 打折收費(fèi)子類
* @author admin
*
*/
public class CashRebate implements CashSuper{
private double moneyRebate=1;
public CashRebate(double moneyRebate){//打折收費(fèi)初始化時(shí)必須輸入折扣率
this.moneyRebate = moneyRebate;
}
public double acceptCash(double money) {
return money*moneyRebate;
}
}
package 策略模式;
/**
* 正常收費(fèi)
* */
public class CashNormal implements CashSuper{
public double acceptCash(double money) {
return money;
}
}
package 策略模式;
/**
* 現(xiàn)金收費(fèi)工廠
* @author admin
*
*/
public class CashFactory {
public static CashSuper createCashAccept(String type){
CashSuper result = null;
switch(type){
case "正常收費(fèi)":
result = new CashNormal();
break;
case "滿300返100":
result = new CashReturn(300, 100);
break;
case "打八折":
result = new CashRebate(0.8);
break;
}
return result;
}
}
是不是感覺上面的代碼很清爽蜈块,確實(shí),設(shè)計(jì)模式就是能給你帶來清爽和飄柔的感覺渴邦。雖然簡(jiǎn)單工廠模式能解決上面的問題但是這個(gè)模式只是解決了對(duì)象的創(chuàng)建的問題疯趟,商場(chǎng)可能是經(jīng)常性的改變打折額度和返利額度拘哨,每次維護(hù)和擴(kuò)展收費(fèi)的方式都需要去修改這個(gè)工廠谋梭,以至于代碼需要重新編譯和部署。這個(gè)不是最好的處理方式倦青。策略模式可以很好的解決上面的問題:
package 策略模式;
/***
* 策略模式
* @author admin
*
*/
public class CashContext {
private CashSuper cashSuper;
public CashContext(CashSuper cashSuper){//通過構(gòu)造方法傳入具體的收費(fèi)的策略
this.cashSuper = cashSuper;
}
/**策略模式與簡(jiǎn)單工廠結(jié)合*/
public CashContext(String type){//參數(shù)不是具體的收費(fèi)策略對(duì)象而是一個(gè)字符串瓮床,表示收費(fèi)類型
switch(type){
case "正常收費(fèi)":
cashSuper = new CashNormal();
break;
case "滿300返100":
cashSuper = new CashReturn(300, 100);
break;
case "打八折":
cashSuper = new CashRebate(0.8);
break;
}
}
public double GetResult(double money){//根據(jù)收費(fèi)策略的不同獲得計(jì)算的結(jié)果
return cashSuper.acceptCash(money);
}
}