1开放封闭原则OCP

一、什么是开放封闭原则

  开放封闭原则(Open-Closed Principle):一个软件实体 应当对扩展开放,则修改关闭。

  在设计一个模块时,应当使得这个模块可以在不被修 改的前提下被扩展。也就是说,应当可以在不必修改源 代码的情况下修改这个模块的行为。

  设计的目的便在于面对需求的改变而保持系统的相对 稳定,从而使得系统可以很容易的从一个版本升级到另 一个版本。

二、怎样做到开放封闭原则

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

  我们并不害怕改变的到来。当变化到来时,我们首 先需要做的不是修改代码,而是尽可能的将变化抽象出 来进行隔离,然后进行扩展。面对需求的变化,对程序 的修改应该是尽可能通过添加代码来实现,而不是通过 修改代码来实现。

  实际上,变化或者可能的变化来的越早,抽 象就越容易,相对的,代码的维护也就越容易; 而当项目接近于完成而来的需求变化,则会使抽 象变得很困难——这个困难,并不是抽象本身的 困难,抽象本身并没有困难,困难在于系统的架构已经完成,修改牵扯的方面太多而使得抽象 工作变得很困难。

三、繁忙的银行业务员

四、轻松的银行业务员

三、开放封闭原则的优越性

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

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

没使用开关封闭集合

 1 //银行业务员
 2 public class BankWorker {
 3     //负责存款业务
 4     public void saving() {
 5         System.out.println("进行存款操作");
 6     }
 7     
 8     //负责取款业务
 9     public void drawing() {
10         System.out.println("进行取款操作");
11     }
12     
13     //负责转账业务
14     public void zhuanzhang() {
15         System.out.println("进行转账操作");
16     }
17     
18     //负责基金的申购
19     public void jijin() {
20         System.out.println("进行基金申购操作");
21     }
22 }

测试

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         BankWorker bankWorker = new BankWorker();
 4         //存款
 5         bankWorker.saving();
 6         
 7         //取款
 8         bankWorker.drawing();
 9         
10         //转账
11         bankWorker.zhuanzhang();
12         
13         //基金
14         bankWorker.jijin();
15     }
16 }

=================================================================

银行业务员接口,是所有银行业务员的抽象父类

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         BankWorker bankWorker = new BankWorker();
 4         //存款
 5         bankWorker.saving();
 6         
 7         //取款
 8         bankWorker.drawing();
 9         
10         //转账
11         bankWorker.zhuanzhang();
12         
13         //基金
14         bankWorker.jijin();
15     }
16 }

负责取款业务的业务员

1 //负责取款业务的业务员
2 public class DrawingBankWorker  implements BankWorker{
3 
4     public void operation() {
5         System.out.println("进行取款操作");
6     }    
7 }

办基金

1 //办基金
2 public class JiJinBankWorker implements BankWorker {
3 
4     public void operation() {
5         System.out.println("进行基金申购操作");
6     }
7 }

负责存款业务的业务员

1 //负责存款业务的业务员
2 public class SavingBankWorker implements BankWorker {
3 
4     public void operation() {
5         System.out.println("进行存款操作");
6     }
7 }

负责转账业务的业务员

1 //负责转账业务的业务员
2 public class ZhuanZhangBankWorker implements BankWorker {
3 
4     public void operation() {
5         System.out.println("进行转账操作");
6     }
7 }

测试

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         BankWorker bankWorker = new SavingBankWorker();
 4         bankWorker.operation();
 5         
 6         BankWorker bankWorker2 = new DrawingBankWorker();
 7         bankWorker2.operation();
 8         
 9         BankWorker bankWorker3 = new ZhuanZhangBankWorker();
10         bankWorker3.operation();
11         
12         BankWorker bankWorker4 = new JiJinBankWorker();
13         bankWorker4.operation();
14     }
15 }

 

原文地址:https://www.cnblogs.com/justdoitba/p/9036295.html