`
come_for_dream
  • 浏览: 120792 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

里氏代换原则

阅读更多

里氏代换原则

       里氏代换原则通俗的解释就是任何可以出现基类(父类)的地方必须能够透明地使用子类对象。里氏代换原则是实现开闭原则的基础,在程序设计中应该尽量使用基类来对对象进行定义,在运行时在确定要使用的子类,用子类对象来替换父类对象,里氏代换原则强调面向父类编程。

      但是里氏代换原则需要注意的几点有:

      1、子类中的所有方法必须在父类中声明,或者说子类必须是吸纳父类的全部方法

            为什么这么说呢?比如有下面这样两个类:


我们可以看到子类SubClass继承了基类BaseClass并实现了Operation1()方法,同时又增加了Operation2()方法,如果我们用SubClass obj=new SubClass();那么我们的这个obj对象是访问不到Operation2()方法的,也就是当我们针对父类编程则无法使用子类中新增的方法Operation2(),要想使用Operation2()方法不能用父类声,必须使用子类进行声明,说明这样的设计思路是违反里氏代换原则的。

     2、在运用里氏代换原则的时候要尽量把类设计成接口或者抽象类,让子类去继承父类或者实现接口,实现父类中声明的方法,在运行时使用子类替换父类实例,我们可以很方便的来扩展系统。

---------------------------------------------------低调的分割线----------------------------------------

 

我们使用一个例子来说明这个具体的问题,动物管理员要喂猴子水果,当然每天的喂的水果可能是苹果也可能是香蕉。那么我们这个设计会这样设计:



 代码:

 

public class ZooKeeper {
	public static void main(void String []args) {
		// TODO implement here
		Apple apple=new Apple();
		Monkey monkey=new Monkey();
		monkey.setApple(apple);
		monkey.eat();
	}
}

 

 

与之对应的的Monkey中的方法可能存在下面的代码:

public void eat() {
		apple.eat();
	
	}

 如果动物管理员要给猴子喂香蕉吃,那么我们就必须修改猴子eat()中的源代码源代码。那么现在我们可以使用里氏代换原则对这个设计进行重构。

 

 

 客户类ZooKeeper可以通过读取配置文件config.xml文件通过反射生成对象注入到Monkey中。根据里氏代换原则这里setFruit可以接受Apple的子类Banana的对象,从而大大提高程序的灵活性。

 

面向对象更好的实现了复用,而要实现高复用性就要遵从开闭原则(对修改组件的代码关闭,对扩展组件开放),而里氏代换原则是实现开闭原则的基础。

  • 大小: 7 KB
  • 大小: 16.8 KB
  • 大小: 154.1 KB
分享到:
评论

相关推荐

    里氏代换原则案例程序LSP.zip

    里氏代换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,由芭芭拉·里科夫(Barbara Liskov)在1988年提出。该原则规定,子类必须能够替换它们的基类,并且在软件系统中不会产生任何...

    java的里氏代换原则

    里氏代换原则是面向对象设计的基本原则之一,源自于著名数学家贝努利·里氏的一个概念。在Java编程中,它对于理解和构建可扩展、健壮的软件系统至关重要。简单来说,里氏代换原则(LSP,Liskov Substitution ...

    里氏代换原则原文

    里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该...

    第二十八讲:基础三里氏代换原则

    **第二十八讲:基础三里氏代换原则** 在面向对象设计中,三里氏代换原则(Liskov Substitution Principle,简称LSP)是一个核心的设计原则,它由芭芭拉·里科夫(Barbara Liskov)在1988年提出。这个原则是类型继承...

    里氏替换原则Demo

    里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,它是由美国计算机科学家芭芭拉·里科夫(Barbara Liskov)提出的。这个原则强调的是在软件工程中,子类型必须能够替换它们的...

    c++里氏替换原则说明1

    C++ 里氏替换原则详解 C++ 里氏替换原则是指在面向对象编程中,子类对象可以替换其基类对象的使用,而不影响程序的逻辑正确性。这个原则是由Barbara Liskov提出的,她认为在子类继承基类时,子类对象应该可以替换...

    里氏代换原则_动力节点Java学院整理

    里氏代换原则是面向对象设计的基本原则之一,它的核心思想是确保软件系统的各个组件能够灵活替换而不影响整体系统的稳定性。这一原则由Barbara Liskov在1988年提出,因此也被称为Liskov替换原则(LSP)。在Java和...

    13丨软件设计的里氏替换原则:正方形可以继承长方形吗?.pdf

    里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,由Barbara Liskov在1988年提出。该原则指出,子类型必须能够替换它们的基类型而不影响程序的正确性。这意味着在软件系统中,...

    Java23种基本的设计模式整料整理学习源码示例zip

    里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的...

    24种设计模式介绍与6大设计原则

    而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真...

    面向对象设计原则Java概要.ppt

    里氏代换原则  里氏代换原则定义 里氏代换原则(Liskov Substitution Principle, LSP)指出,子类必须能够替换它们的基类,而不影响程序的正确性。这意味着子类对象可以在任何基类对象被预期出现的地方进行替换,...

    设计模式Demo

    而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真...

    软件设计的七大原则.doc

    软件设计的七大原则是软件设计的精髓所在,这七大原则分别是开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。 一、 开闭原则(OCP) 开闭原则是指一个软件实体...

    java设计模式五大原则.doc

    Java 设计模式五大原则是软件设计中非常重要的原则,它们是:开-闭原则、里氏代换原则、依赖倒转原则、接口隔离原则和迪米特法则。这些原则都是软件设计的基石,它们指导我们如何设计出更加灵活、可维护、可扩展的...

    面向对象的设计的原则 电子版

    在面向对象设计中,有七个基本原则,即单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、合成复用原则和迪米特法则。 1. 单一职责原则(SRP):一个类只负责一个功能领域中的相应职责。单一职责...

    软件设计的七大原则

    这些原则包括开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。这些原则的目的是为了提高软件系统的灵活性、适应性、稳定性和延续性。 一、 开闭原则(OCP) 开...

    程序设计的七大原则

    按照里氏代换原则,答案是否定的,因为正方形的一些行为会违反长方形的行为(例如,正方形无法通过改变宽高而不等比例调整尺寸)。 #### 三、依赖倒置原则 (Dependence Inversion Principle) 依赖倒置原则的核心...

    软件工程阶段性报告原则

    以下主要探讨五个关键的设计原则:单一职责原则、开闭原则、里氏代换原则、依赖倒转原则以及合成复用原则。 1. 单一职责原则(Single Responsibility Principle, SRP) 该原则强调一个类或模块应只有一个引起其变化...

Global site tag (gtag.js) - Google Analytics