干掉 if else!

编程入门 行业动态 更新时间:2024-10-06 06:40:36

干掉 if else!

干掉 if else!

if…else控制语句,如果代码里滥用会大大降低代码的可读性、可维护性、可扩展性以及灵活性,进而使整个软件系统造成危害。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷,因此违反了违反单一职责原则和开闭原则,而且有些公司的代码审查会通不过。

所以,if else的替代方案是很有必要的,如位语句,枚举,工厂模式,策略模式,状态模式等等。这里用一个场景详细说明if else的替代方案,大家用支付宝付款的时候,会有多种付款方式,如余额,花呗,余额宝,信用卡,银行卡。

01. 传统的方式

public class PayDemo {public String pay(String payType) {String pay = "";if ("1".equals(payType)) {pay = "支付宝余额支付";} else if ("2".equals(payType)) {pay = "支付宝余额宝支付";} else if ("3".equals(payType)) {pay = "支付宝花呗支付";} else {pay = "其他支付";}//...System.out.println(pay);return pay;}
}public class PayTest {public static void main(String[] args) {PayDemo payDemo = new PayDemo();payDemo.pay("1");payDemo.pay("2");payDemo.pay("3");payDemo.pay("4");}
}

枚举第一种

(1)面向接口编程,首先定义一个支付接口

public interface PayEnum {String pay();
}

(2)定义一个具体的支付宝余额实现

public class PayEnumByBalance implements PayEnum{@Overridepublic String pay() {System.out.println("支付宝余额支付");return "支付宝余额支付";}
}

(3)定义一个具体的支付宝花呗实现

public class PayEnumByHuabei implements PayEnum {@Overridepublic String pay() {System.out.println("支付宝花呗支付");return "支付宝花呗支付";}
}

(4)定义一个具体的支付宝余额宝实现

public class PayEnumByYuEBAO implements PayEnum {@Overridepublic String pay() {System.out.println("支付宝余额宝支付");return "支付宝余额宝支付";}
}

(5)定义一个枚举类

public enum PayTypeEnum {PAY_BALANCE("1",new PayEnumByBalance()),PAY_HUABEI("2",new PayEnumByHuabei()),PAY_YUEBAO("3",new PayEnumByYuEBAO());private String payType;private PayEnum payEnum;PayTypeEnum(String payType, PayEnum payEnum) {this.payType = payType;this.payEnum = payEnum;}public static PayEnum getPay(String payType){for (PayTypeEnum payTypeEnum : PayTypeEnum.values()) {if (payTypeEnum.payType.equals(payType)) {return payTypeEnum.payEnum;}}return new PayEnumByBalance();}
}

(6)客户端

public class PayEnumTest {public static void main(String[] args) {PayEnum payEnum = PayTypeEnum.getPay("1");payEnum.pay();PayEnum payEnum1 = PayTypeEnum.getPay("2");payEnum1.pay();PayEnum payEnum2 = PayTypeEnum.getPay("3");payEnum2.pay();}
}

(7)结果:

(8)总结:完全消除了if else

枚举第二种

(1) 面向接口编程,首先定义一个支付接口

public interface PayEnum1 {String pay();
}

(2)定义一个枚举类,并且实现支付接口

public enum PayTypeEnum1 implements PayEnum1{PAY_TYPE_BALANCE{@Overridepublic String pay() {System.out.println("支付宝余额支付");return "支付宝余额支付";}},PAY_TYPE_HUABEI{@Overridepublic String pay() {System.out.println("支付宝花呗支付");return "支付宝花呗支付";}},PAY_TYPE_YUEBAO{@Overridepublic String pay() {System.out.println("支付宝余额宝支付");return "支付宝余额宝支付";}};
}

(3)客户端代码

public class PayEnum1Test {public static void main(String[] args) {PayEnum1Test payEnum1Test = new PayEnum1Test();payEnum1Test.pay("PAY_TYPE_BALANCE");payEnum1Test.pay("PAY_TYPE_HUABEI");payEnum1Test.pay("PAY_TYPE_YUEBAO");}public String pay(String payType){return PayTypeEnum1.valueOf(payType).pay();}
}

(4)结果:

(5)总结:

根据业务场景,如果代码业务量少,可以用枚举第二种,如果代码业务量大,可以用枚举第一种。都可以解决if else代码。

02. 工厂模式

public interface PayFactory {String pay();
}public class PayFactoryByBalance implements PayFactory {@Overridepublic String pay() {System.out.println("支付宝余额支付");return "支付宝余额支付";}
}public class PayFactoryByHuabei implements PayFactory {@Overridepublic String pay() {System.out.println("支付宝花呗支付");return "支付宝花呗支付";}
}public class PayFactoryByYuEBAO implements PayFactory {@Overridepublic String pay() {System.out.println("支付宝余额宝支付");return "支付宝余额宝支付";}
}
 
public class PayTypeFactory {private static Map<String,PayFactory> payTypeMap = new HashMap<>();static {payTypeMap.put("1",new PayFactoryByBalance());payTypeMap.put("2",new PayFactoryByHuabei());payTypeMap.put("3",new PayFactoryByYuEBAO());}public static PayFactory getPayType(String payType){return payTypeMap.get(payType);}}
 
public class PayFactoryTest {public static void main(String[] args) {PayTypeFactory.getPayType("1").pay();PayTypeFactory.getPayType("2").pay();PayTypeFactory.getPayType("3").pay();}
}

结果:

03. 策略模式+工厂模式

策略模式一句话就是,定义一系列算法,把他们封装起来,并且使它们可以相互替换。具体来说就说,定义多个策略对象,每个策略对象里面封装好多种算法,再定义一个上下文对象,该上下文对象负责根据传入不同的策略对象,执行不同的行为。

(1)定义一个抽象的公共策略接口Strategy,通常为接口,定义每个策略或算法必须具有的方法和属性。

public interface PayStrategy {String pay();
}

(2)定义一个context对象,即扮演一个上下的文角色,起承上启下的封装作用,其行为随着策略对象改变而改变。

public class PayContext {private PayStrategy payStrategy;public PayContext(PayStrategy payStrategy) {this.payStrategy = payStrategy;}public String executeStrategy(){return payStrategy.pay();}
}
 

(3)定义一个具体的余额支付策略

public class PayStrategyByBalance implements PayStrategy {@Overridepublic String pay() {System.out.println("支付宝余额支付");return "支付宝余额支付";}
}

(4)定义一个具体的花呗支付策略

public class PayStrategyByHuabei implements PayStrategy {@Overridepublic String pay() {System.out.println("支付宝花呗支付");return "支付宝花呗支付";}
}

(5)定义一个具体的余额宝支付策略

public class PayStrategyByYuEBAO implements PayStrategy {@Overridepublic String pay() {System.out.println("支付宝余额宝支付");return "支付宝余额宝支付";}
}

(6)客户端

public class PayStrategyTest {public static void main(String[] args) {PayStrategyTest payStrategyTest = new PayStrategyTest();payStrategyTest.method("1");payStrategyTest.method("2");payStrategyTest.method("3");}public void method(String payType){PayContext payContext;if ("1".equals(payType)){payContext = new PayContext(new PayStrategyByHuabei());payContext.executeStrategy();}else if ("2".equals(payType)){payContext = new PayContext(new PayStrategyByYuEBAO());payContext.executeStrategy();}else if ("3".equals(payType)){payContext = new PayContext(new PayStrategyByBalance());payContext.executeStrategy();}}}

(7)结果:

此时只有策略模式,还没有加入工厂模式

(8)定义一个策略工厂类

public class PayStrategyFactory {private static Map<String, PayStrategy> payTypeMap = new HashMap<>();static {payTypeMap.put("1",new PayStrategyByBalance());payTypeMap.put("2",new PayStrategyByYuEBAO());payTypeMap.put("3",new PayStrategyByHuabei());}public static PayStrategy getPayType(String payType){return payTypeMap.get(payType);}
}

(9)再看客户端代码

public class PayStrategyFactoryTest {public static void main(String[] args) {PayContext payContext = new PayContext(PayStrategyFactory.getPayType("1"));payContext.executeStrategy();PayContext payContext2 = new PayContext(PayStrategyFactory.getPayType("2"));payContext2.executeStrategy();PayContext payContext3 = new PayContext(PayStrategyFactory.getPayType("3"));payContext3.executeStrategy();}
}

运行结果还是一样的就不看了哈

05. 状态模式+工厂模式

状态模式一句话来说就是,允许一个对象在其对象内部状态改变时改变它的行为。具体来讲,定义多种状态对象,和定义一个行为随着状态对象改变而改变的 context 对象。

(1)面向接口编程,定义一个支付接口

public interface PayState {String pay(PayContext payContext);
}

(2)定义一个context上下文

public class PayContext {private PayState payState;public PayContext() {this.payState = null;}public void setPayState(PayState payState) {this.payState = payState;}public PayState getPayState() {return payState;}
}

(2)定义具体的状态类

public class PayStateByBalance implements PayState {@Overridepublic String pay(PayContext payContext) {System.out.println("支付宝余额支付");payContext.setPayState(this);return "支付宝余额支付";}
}
 
public class PayStateByHuabei implements PayState {@Overridepublic String pay(PayContext payContext) {System.out.println("支付宝花呗支付");payContext.setPayState(this);return "支付宝花呗支付";}
}
 
public class PayStateByYuEBAO implements PayState {@Overridepublic String pay(PayContext payContext) {System.out.println("支付宝余额宝支付");payContext.setPayState(this);return "支付宝余额宝支付";}
}

(3)客户端

public class PayStateTest {public static void main(String[] args) throws InterruptedException {PayStateTest payStateTest = new PayStateTest();payStateTest.method("1");payStateTest.method("2");payStateTest.method("3");}public void method(String payType){PayContext context = new PayContext();if ("1".equals(payType)) {PayStateByBalance payStateByBalance = new PayStateByBalance();payStateByBalance.pay(context);}else if("2".equals(payType)) {PayStateByHuabei payStateByHuabei = new PayStateByHuabei();payStateByHuabei.pay(context);}else if("3".equals(payType)) {PayStateByYuEBAO payStateByYuEBAO = new PayStateByYuEBAO();payStateByYuEBAO.pay(context);}}
}

(4)结果:

此时仅仅是状态模式,没有彻底取消if else

(5)加入工厂模式

public class PayStateFactory {private static Map<String, PayState> payTypeMap = new HashMap<>();static {payTypeMap.put("1",new PayStateByBalance());payTypeMap.put("2",new PayStateByYuEBAO());payTypeMap.put("3",new PayStateByHuabei());}public static PayState getPayType(String payType){return payTypeMap.get(payType);}
}

(6)再看客户端代码

public class PayStateFactoryTest {public static void main(String[] args) {PayContext context = new PayContext();PayStateFactory.getPayType("1").pay(context);PayStateFactory.getPayType("2").pay(context);PayStateFactory.getPayType("3").pay(context);}
}

总结:完全解决了代码中的 if else,本文作者:王德印,欢迎复制下方链接关注博主动态。

链接:

【END】

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「web_resource」,关注后回复「进群」或者扫描下方二维码即可进入无广告交流群。

↓扫描二维码进群↓

更多推荐

干掉 if else!

本文发布于:2024-02-13 18:24:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1759520.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!