面向對象6大原則之----開閉原則

代碼結構

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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章