代码结构
OpenClosedPrincipleNo.java 没有使用开闭原则代码
//假定都是账户总金额为100
//不同的银行转账的手续费不一样,A银行的手续费为0.01
class BankA{
public double transforMoney(double money){
//有可能还有其它一系列操作,每个银行的不一样
return 100-0.01*money;
}
}
//不同的银行转账的手续费不一样,B银行的手续费为0.02
class BankB{
public double transforMoney(double money){
//有可能还有其它一系列操作,每个银行的不一样
return 100-0.02*money;
}
}
public class OpenClosedPrincipleNo {
/**
* 问题:如果现在对转账功能进行扩展,又多加了一个银行。
* 必须要做的事:
* 1. 加相应银行类及其转账方法
* 2.在此处方法的分支判断中加新增银行的
* 如此,不利于扩展。违反了开闭原则。对扩展开放,对修改关闭。
* 要扩展功能最好不要动(修改)以前的代码。
* @param bankType
* @return
*/
public double transforMoney(String bankType){
double currentMoney = 0;
if("A".equals(bankType)){
currentMoney = new BankA().transforMoney(20);
}else if("B".equals(bankType)){
currentMoney = new BankB().transforMoney(20);
}
return currentMoney;
}
public static void main(String[] args) {
OpenClosedPrincipleNo tool = new OpenClosedPrincipleNo();
//使用银行A进行转账
tool.transforMoney("A",30);
//使用银行B进行转账
tool.transforMoney("B",30);
//使用银行C进行转账
//必须要:1.修改OpenClosedPrincipleNo中的transforMoney方法 2.新增BankC类
//此处举例比较简单,如果是复杂点的呢。可能要改的更多
tool.transforMoney("C",30);
}
}
OpenClosedPrinciple.java 使用了开闭原则代码
//抽象或者提取出一个类或者接口,其它银行对此类或者接口的方法进行实现
interface Bank{
public double transforMoney(double money);
}
//假定都是账户总金额为100
//不同的银行转账的手续费不一样,A银行的手续费为0.01
//实现银行接口方法
class BankA1 implements Bank{
public double transforMoney(double money){
//有可能还有其它一系列操作,每个银行的不一样
return 100-0.01*money;
}
}
//不同的银行转账的手续费不一样,B银行的手续费为0.02
//实现银行接口方法
class BankB1 implements Bank{
public double transforMoney(double money){
//有可能还有其它一系列操作,每个银行的不一样
return 100-0.02*money;
}
}
//不同的银行转账的手续费不一样,B银行的手续费为0.02
//实现银行接口方法
class BankC1 implements Bank{
public double transforMoney(double money){
//有可能还有其它一系列操作,每个银行的不一样
return 100-0.022*money;
}
}
public class OpenClosedPrinciple{
//需要哪个银行,直接把哪个银行作为参数传过来即可。
// 多态的使用方式 1.作为方法参数传过来(常用) 2.作为返回值
public double transforMoney(Bank bank,double money){
return bank.transforMoney(money);
}
public static void main(String[] args) {
OpenClosedPrinciple tool = new OpenClosedPrinciple();
//如果想用银行A进行转账
Bank bank = new BankA1();
tool.transforMoney(bank,50);
//如果想用银行B进行转账
bank = new BankB1();
tool.transforMoney(bank,50);
//现在业务扩展,要用银行C(或者更多其它银行)进行转账,必须要做的事
//1.新增一个银行C类来实现银行接口类(未修改原有代码)
//2.直接调用方法进行使用(未修改原有代码)
//符合开闭原则,非常好
//无论是抽象还是接口,主要使用了面向对象的多态功能
bank = new BankC1();
tool.transforMoney(bank,50);
}
}