欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA设计原则:开放封闭原则

程序员文章站 2022-07-13 21:54:38
...

开放封闭原则

开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放,则修改关闭。在设计一个模块时,应当使得这个模块可以在不被修改的前提下被扩展。也就是说,应当可以在不必修改源代码的情况下修改这个模块的行为。设计的目的便在于面对需求的改变而保持系统的相对稳定,从而使得系统可以很容易的从一个版本升级到另一个版本。

一、怎么做到开放封闭原则

实际上,绝对封闭的系统是不存在的。无论模块是怎么封闭,到最后,总还是有一些无法封闭的变化。而我们的思路就是:既然不能做到完全封闭,那我们就应该对那些变化封闭,那些变化隔离做出选择。我们做出选择,然后将那些无法封闭的变化抽象出来,进行隔离,允许扩展,尽可能的减少系统的开发。当系统变化来临时,我们要及时的做出反应。
我们并不害怕改变的到来。当变化到来时,我们首先需要做的不是修改代码,而是尽可能的将变化抽象出来进行隔离,然后进行扩展。面对需求的变化,对程序的修改应该是尽可能通过添加代码来实现,而不是通过修改代码来实现。

二、例子一,繁忙的银行业务员

JAVA设计原则:开放封闭原则

根据代码会发现,如果增加了其他业务员,就需要在BankWorker中添加一个业务方法,也让银行业务员“业务”繁忙,容易混乱,扩展性也不好

2.1 BankWoker
//银行业务员
public class BankWorker {
    //负责存款业务
    public void saving() {
        System.out.println("进行存款业务");
    }
    //负责取款业务
    public void drawing(){
        System.out.println("进行取款业务");
    }
    //负责转账业务
    public void transfering(){
        System.out.println("进行转账业务");
    }
    //负责基金申购
    public void buying(){
        System.out.println("进行基金购买");
    }
}
2.2 MainClass
public class MainClass {
    public static void main(String[] args){
        BankWorker bankWorker = new BankWorker();
        //存款
        bankWorker.saving();
        //取款
        bankWorker.drawing();
    }
}

三、例子二,轻松的银行业务员

JAVA设计原则:开放封闭原则

将银行业务员设置为接口,下面为实现的子类,分为存款业务员、取款业务员、转账业务员等,将业务逻辑分割,改造后分工明确,各施其职,不容易混乱。

例如下面需要增加业务的时候,只需要继续添加子类进行扩展,实现了开放封闭原则,没有大面积修改之前的代码,

3.1 BankWorker
//银行业务员
public interface BankWorker {
    public void operation();
}
3.2 SavingBankWorker
//负责存款业务员
public class SavingBankWorker implements  BankWorker{
    public void operation() {
        System.out.println("进行存款业务");
    }
}
3.3 DrawingBankWorker
//负责取款业务员
public class DrawingBankWorker implements BankWorker {
    public void operation() {
        System.out.println("进行取款业务");
    }
}
3.4 TransferingBankWorker
//负责转装业务员
public class TransferingBankWorker implements BankWorker {
    public void operation() {
        System.out.println("进行转装业务");
    }
}
3.5 MainClass
public class MainClass {
    public static void main(String[] args){
        //改造后分工明确,各施其职,不容易混乱
        BankWorker bankWorker = new SavingBankWorker();
        bankWorker.operation();
        BankWorker bankWorker1 = new DrawingBankWorker();
        bankWorker1.operation();
    }
}

四、优点

  • 通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,是变化中的软件有一定的适应性和灵活性。

  • 已有的软件模块,特别是最重要的抽象模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。