Java七大设计原则 - 里氏替换原则 (Liskov Substitution Principle)

一、什么是 里氏替换原则 (Liskov Substitution Principle)

   里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。

   里氏代换原则中说:任何基类可以出现的地方,子类一定可以出现

   LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

   -- 任何基类出现的地方、子类一定可以出现

   -- 在程序中尽量使用基类的类型来 定义对象、在运行时确认子类子类,用子类对象替换父类对象

里氏代换原则是开闭原则的手段之一、是对“开-闭”原则的补充。

    实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范

     1. 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。
     2.继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障
    3.编程中,如何正确的使用继承? => 里氏替换原则

-----------------------------

1.  在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法

 

例子:

//学生
public class Student {
   
    public void study(){
      //学习
    }
}

//张三学生
public class ZhangSan implements Student{
    
}



//老师
public class Teacher{

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


public class School {

    public static void main(String[] args) {

	   Student zz =new Student();
       new Teacher().teach(zz);	  
	   
	   //Student 表面类型 - 可以替换为实际类型ZhangSan
	   //后续来新的学生  李四、王五
	   
	   //1.扩展性强   2.替换为子类后、不影响原有逻辑
       	 
	  

   }
}

  但是! 假如有继承后、需要修改原本父类方法的

  比如来了一个 体育生、他不学习、他跑步 ---------- 那就不能让他重写 study 会破坏原有“学习逻辑“

里氏替换原则通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉, 采用依赖,聚合,组合等关系代替。

方案

//学生
public class Student implements IStudent{
   
    @overide
    public void study(){
      //普通学生学习
    }
}

//体育生
public class SpoStudent implements IStudent{
    
	@overide
    public void study(){
      //体育生是锻炼
    }
}



//老师
public class Teacher{

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

  

  

  

  

   

你可能感兴趣的:(设计模式,代码结构,里氏替换原则)