zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    firefox打开链接自动跳转至新页面设置
    sql server 查询不为空的字段
    C# 判断ip地址是否正确
    Win7自带功能,刻录光盘遇到的问题
    【一起学源码-微服务】Nexflix Eureka 源码六:在眼花缭乱的代码中,EurekaClient是如何注册的?
    【一起学源码-微服务】Nexflix Eureka 源码五:EurekaClient启动要经历哪些艰难险阻?
    【一起学源码-微服务】Nexflix Eureka 源码四:EurekaServer启动之完成上下文构建及EurekaServer总结
    【一起学源码-微服务】Nexflix Eureka 源码三:EurekaServer启动之EurekaServer上下文EurekaClient创建
    【一起学源码-微服务】Nexflix Eureka 源码二:EurekaServer启动之配置文件加载以及面向接口的配置项读取
    【一起学源码-微服务】Netflix Eureka 源码一:Netflix Eureka 源码初探,我们为什么要读源码?
  • 原文地址:https://www.cnblogs.com/justdoitba/p/9036295.html
Copyright © 2011-2022 走看看