Java七大设计原则 - 开闭原则

一、 什么是开闭原则(Open Closed Principle)?

        开闭原则(Open Closed Principle,OCP)又称为ocp原则, 由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:

       软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。

    (对扩展开放是针对提供方来说的,对修改关闭是针对调用方来说的。)    

      实现“开-闭”原则的关键步骤就是抽象化 、核心思想就是面向抽象编程,

二、怎么出现的 ?

          软件因为需求变化、升级等等原因、需要对软件代码进行修改时,可能会给旧代码中引入错误、影响原有业务的逻辑或者 整个软件的稳定性、这样的损失是不可估量的。

         如果是较为复杂的业务、也可能会使我们不得不对整个功能进行重构开发,并且需要经过大量的测试耗费人力和效率。    

三、为什么要使用开闭原则?

第一:只要是面向对象编程,在开发时都会强调开闭原则

          控制好开闭的维度、软件测试视、只需要对扩展的代码进行测试就可以、不影响原有的业务

第二:开闭原则是最基础的设计原则,其它的设计原则都是开闭原则的具体形态,

          其它的设计原则是指导设计的工具和方法,而开闭原则才是其精神领袖。依照Java语言的称谓,开闭原则是抽象类,而其它的五个原则是具体的实现类。

第三:开闭原则可以提高复用性
         在面向对象的设计中,所有的逻辑都是从原子逻辑组合而来,而不是在一个类中独立实现一套业务逻辑。只有这样的代码才可以复用,逻辑粒度越小,被复用的可能性越大。

       复用可以减少代码的重复,避免相同的逻辑分散在多个角落,减少维护人员的工作量以及系统变化时产生bug的机会。

       怎么才能提高复用率呢?设计者需要缩小逻辑粒度,直到一个逻辑不可以分为止。

第四:开闭原则可以提高软件的维护性
        一款软件量产后,维护人员的工作不仅仅对数据进行维护,还可能要对程序进行扩展,维护人员最乐意的事是扩展一个类,而不是修改一个类。让维护人员读懂原有代码,再进行修改,是一件非常痛苦的事情,不要让他在原有的代码海洋中游荡后再修改,那是对维护人员的折磨和摧残。

第五:面向对象开发的要求
         万物皆对象,我们要把所有的事物抽象成对象,然后针对对象进行操作,但是万物皆发展变化,有变化就要有策略去应对,怎么快速应对呢?这就需要在设计之初考虑到尽可能多变化的因素,然后留下接口,等待“可能”转变为“现实”。

四、具体实例

举例:

public class ZhangSan implements IStudent{
    @overide
    public void yuwen(){
     //学习语文
    }
}

public class LiSi implements IStudent{
    
    public void shuxue(){
      //学习数学
    }
}

public class Teacher{

    @override
    public void teach(IStudent student){    
	   
	   if(student is Zhangsan){
	   //如果是张三 教他语文   
		  student.yuwen();
		  
	   }else if(student is lisi){
	   //如果是李四、教他数学
	      student.yuwen();
	   }
    }
}


public class School {

     public static void main(String[] args) {
          Teacher tt = new Teacher();
		  //老师教张三语文
          tt.teach(new ZhangSan());	  
		  //老师教李四数学
		  tt.teach(new lisi());	  
   }
}

       假如需求变动、来了一个新同学  “张三的弟弟要和张三一起学语文、自己学地理" , 新来 “王五同学 ”学习地理,既需要修改老师、又要修改学生

  

public class ZhangSan implements IStudent{
    @overide
    public void study(){
      //学习语文
    }
}

public class LiSi implements IStudent{
    @overide
    public void study(){
      //学习数学
   }
}

 新需求: 王五学地理 ------                 (只扩展提供方)

public class WangWu implements IStudent{
    
    @overide
    public void study(){
      //学习地理
   }
}

 新需求: 张三的弟弟和哥哥一起学语文、 自己学地理 ------ (只扩展提供方)
public class ZhangSanDD extends IStudent{
    
    @overide
    public void study(){
       super.study(); -- 继承哥哥的学语文
       study_dili     -- 自己再学地理
   }
}



******* 调用方:在新需求下不用修改 *****
public class Teacher{

    @override
    public void teach(IStudent student){     
		student.study();
    }
}


public class School {

     public static void main(String[] args) {
          Teacher tt = new Teacher();
          tt.teach(new ZhangSan());	  
		  tt.teach(new LiSi());
		  //--------新增需求 ------------
          tt.teach(new WangWu())		  
          tt.teach(new ZhangSanDD())	
   }
}

你可能感兴趣的:(设计模式,代码结构,开闭原则)