面向对象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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值