策略模式一般用法就是一個接口有多個實現類纳令,每個實現類都是對接口的不同實現,均代表了接口的不同實現形式克胳,比如說平绩,一個計算的接口,你不必在接口中定義加減乘除的抽象方法漠另,僅需要一個抽象方法捏雌,多個實現類來實現這個接口中的抽象方法即可。
普通用法
抽象接口
/**
* 計算接口
*
* @author zhangjianbing
* time 2019/11/11
*/
public interface Calculate {
BigDecimal doCalc(BigDecimal var1, BigDecimal var2);
}
接口的實現類
/**
* 加法實現類{@link Calculate}
*
* @author zhangjianbing
* time 2019/11/11
*/
public class CalcAdd implements Calculate {
@Override
public BigDecimal doCalc(BigDecimal var1, BigDecimal var2) {
return var1.add(var2).setScale(2, BigDecimal.ROUND_HALF_UP);
}
}
/**
* 減法實現類{@link Calculate}
*
* @author zhangjianbing
* time 2019/11/11
*/
public class CalcSub implements Calculate {
@Override
public BigDecimal doCalc(BigDecimal var1, BigDecimal var2) {
return var1.subtract(var2).setScale(2, BigDecimal.ROUND_HALF_UP);
}
}
測試類
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class Test01 {
public static void main(String[] args) {
Calculate calculate1 = new CalcAdd();
BigDecimal doCalc1 = calculate1.doCalc(new BigDecimal(1), new BigDecimal(2));
System.out.println(doCalc1);
System.out.println("-------------------------------------");
Calculate calculate2 = new CalcSub();
BigDecimal doCalc2 = calculate2.doCalc(new BigDecimal(1), new BigDecimal(2));
System.out.println(doCalc2);
}
}
優(yōu)化if-else語句
其實感覺可讀性并不強笆搓,不如直接if-else來的直接性湿,大體思路就是:首先抽象出一個抽象類纬傲,這個抽象類的作用是規(guī)范if條件成立時候的處理邏輯,然后每一個if條件都當成一個抽象類的派生類肤频,當遇到需要判斷的條件的時候嘹锁,把條件傳到一個可以獲取派生類的方法中,利用多態(tài)的特性着裹,看起來僅需要一行代碼就能搞定多個if领猾,但其實,隨著if的增多骇扇,代碼維護以及可讀性變得很低摔竿。比如:有很多種會員,不同的會員有不同的處理邏輯少孝,舉例如下继低。
會員枚舉
/**
* @author zhangjianbing
* time 2019/11/11
*/
public enum MemberEnum {
BRONZE("1", "青銅會員", "BronzeMember"),
SILVER("2", "青銅會員", "SilverMember"),
GOLD("3", "青銅會員", "GoldMember"),
PLATINUM("4", "青銅會員", "PlatinumMember"),
DIAMOND("5", "青銅會員", "DiamondMember");
private String code;
private String desc;
private String name;
MemberEnum(String code, String desc, String name) {
this.code = code;
this.desc = desc;
this.name = name;
}
public static String getNameByCode(String code) {
for (MemberEnum t : MemberEnum.values()) {
if (t.getCode().equals(code)) {
return t.name;
}
}
return null;
}
// -----------------------------------------------------------------
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
抽象接口
/**
* @author zhangjianbing
* time 2019/11/11
*/
public interface IMemberService {
void process(String message);
}
接口派生類
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class BronzeMember implements IMemberService {
@Override
public void process(String message) {
System.out.println("恭喜您," + message);
}
}
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class DiamondMember implements IMemberService {
@Override
public void process(String message) {
System.out.println("恭喜您稍走," + message);
}
}
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class GoldMember implements IMemberService {
@Override
public void process(String message) {
System.out.println("恭喜您袁翁," + message);
}
}
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class PlatinumMember implements IMemberService {
@Override
public void process(String message) {
System.out.println("恭喜您," + message);
}
}
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class SilverMember implements IMemberService {
@Override
public void process(String message) {
System.out.println("恭喜您婿脸," + message);
}
}
向容器中注入Bean
/**
* @author Rednaxela
* @Description: 向容器中注入條件判斷的Bean
* @date 2019/11/11
* @From https://www.zhangjianbing.com
*/
@Configuration
public class BeanRegistryConfig {
@Bean("BronzeMember")
public BronzeMember bronzeMember() {
return new BronzeMember();
}
@Bean("DiamondMember")
public DiamondMember diamondMember() {
return new DiamondMember();
}
@Bean("GoldMember")
public GoldMember goldMember() {
return new GoldMember();
}
@Bean("PlatinumMember")
public PlatinumMember platinumMember() {
return new PlatinumMember();
}
@Bean("SilverMember")
public SilverMember silverMember() {
return new SilverMember();
}
}
測試類
/**
* @author zhangjianbing
* time 2019/11/11
*/
public class Test01 {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanRegistryConfig.class);
String name = MemberEnum.getNameByCode("1");
IMemberService iMemberService = (IMemberService)applicationContext.getBean(name);
iMemberService.process(name);
}
}
總結
個人感覺策略模式的最大好處就是不改變源代碼的基礎上增加派生類粱胜,比如再多一個超級會員的等級,我只需要再寫一個派生類就可以了狐树,其它的代碼以及用法完全不用變焙压,缺點就是你在使用派生類的時候需要知道派生類的名字叫什么或者說判斷的條件是什么,假如派生類很多抑钟,就很難維護涯曲,所謂有利有弊吧。