开闭原则(Open Close Principle,OCP)
原创大约 2 分钟
开闭原则(Open Close Principle,OCP)最早由伯特兰·迈耶(Bertrand Meyer)在他1988
年发行的《面向对象软件构造》中提出。
开闭原则(Open Close Principle,OCP)简单来说就是软件中的对象(类,模块,函数等等)应该对扩展开放,而对修改关闭
,它强调的是用抽象构造框架,用实现扩展细节,可以提高软件系统的可维护性。
目前所有的电商平台都集成了第三方支付功能,能够方便地完整在线支付。
如果把这些第三方支付都放在一个类里面,通过if...else
或switch
来判断支付的手续费率的话,会导致业务代码频繁修改,不利于系统的稳定和维护。
如果将它们进行改造,运用开闭原则(Open Close Principle,OCP)的话就是这样的。
package com.itechthink.designrule.openclose;
/**
* 支付接口
*
*/
public interface IPay {
// 第三方支付平台
String getName();
// 手续费率
Double getCharge();
}
/**
* 第三方支付
*
*/
public class ThirdPay implements IPay {
protected final String name;
protected final Double charge;
public ThirdPay(String name, Double charge) {
this.name = name;
this.charge = charge;
}
@Override
public String getName() {
return this.name;
}
@Override
public Double getCharge() {
return this.charge;
}
}
/**
* 余额支付
*
*/
public class BanlancePay implements IPay {
private final String name;
private final Double charge;
public BanlancePay(String name, Double charge) {
this.name = name;
this.charge = charge;
}
@Override
public String getName() {
return this.name;
}
@Override
public Double getCharge() {
return this.charge;
}
}
/**
* 支付宝支付
*
*/
public class AliPay extends ThirdPay {
public AliPay(String name, Double charge) {
super(name, charge);
}
// 原手续费
public Double getOriginCharge() {
return super.getCharge();
}
// 现手续费
public Double getCharge() {
return super.getCharge() * 0.6;
}
}
/**
* 微信支付
*
*/
public class WeixinPay extends ThirdPay {
public WeixinPay(String name, Double charge) {
super(name, charge);
}
// 原手续费
public Double getOriginCharge() {
return super.getCharge();
}
// 现手续费
public Double getCharge() {
return super.getCharge() * 0.5;
}
}
现在就可以通过一个统一的入口来调用它们了,而且对修改关闭,对扩展开放
。
package com.itechthink.designrule.openclose;
/**
* 开闭原则是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭
* 所谓的开闭,也正是对修改和扩展两个行为的一个原则,它强调的是用抽象构造框架,用实现扩展细节,可以提高软件系统的可维护性
*
*/
public class OpenClose {
public static void main(String[] args) {
// 通过switch分支条件判断手续费率
String payMethod = args[0];
switch (payMethod) {
case "weixin":
System.out.println(1.00);
break;
case "alipay":
System.out.println(1.01);
break;
default:
System.out.println("不支持的支付方式");
}
// 通过继承ThirdPay或实现接口IPay,就可以做到不必修改代码而扩展功能
WeixinPay weixin = new WeixinPay("微信支付", 1.00);
System.out.println(weixin.getCharge());
}
}
感谢支持
更多内容,请移步《超级个体》。