代碼結構
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);
}
}