`
come_for_dream
  • 浏览: 116799 次
  • 性别: 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

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

    java的里氏代换原则

    这一个学习java的笔记,里面主要介绍java的里氏代换原则

    android里氏代换原则_法海捉拿白蛇新解.pdf

    android设计模式里氏代换原则_法海捉拿白蛇新解.pdf

    里氏代换原则原文

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

    里氏替换原则Demo

    http://blog.csdn.net/xingjiarong/article/details/50081857

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

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

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

    NULL 博文链接:https://364232252.iteye.com/blog/2371188

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

    主要为大家详细介绍了里氏代换原则的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

    设计模式Demo

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

    Java与模式(清晰书签版) 设计模式 part3

    第7章 里氏代换原则 第8章 依赖倒转原则 第9章 接口隔离原则 第10章 合成、聚合复用原则 第11章 迪米特法则 第12章 简单工厂模式 第13章 工厂方法模式 第14章 抽象工厂模式 第15章 单例模式 第16章 .......

    设计模式(23种)与设计原则(6种)

    2、里氏代换原则 3、依赖转换原则 4、接口隔离原则 5、合成/聚合复用原则 6、最少知识原则 (二)设计模式 1)工厂模式(Factory) 2)抽象工厂模式(Abstract Factory) 3)建造者模式(Builder) 4)原型模式...

    SQL语句优化2

    里氏代换原则(LSP):一个软件实体如果使用的是一个基类的话,那么一定适用于其子类。 依赖倒转原则(DIP):要依赖于抽象,不要依赖于具体。 接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好。 合成/...

    设计模式——6大软件设计原则(demo案例实现,附带解析,快速掌握软件设计原则的精髓)

    2、里氏代换原则 3、依赖倒转原则 4、接口隔离原则 5、迪米特法则 6、合成复用原则 使用了一个个的demo案例,以通俗易懂的生活案例解析软件开发设计原则,掌握开发细节。写出耦合度低、易于扩展、更容易维护的...

    01 设计模式1

    3.1开闭原则此原则是由Bertrand Meyer提出的 3.2里氏代换原则里氏代换原则是由Barbara Liskov提出的 3.3依赖倒转原则指在软件里面

    java与模式

    7:里氏代换原则;8:依懒倒转原则;9:接口隔离原则;10:合成/聚合复用原则;11:迪米特法原则;12:简单工厂模式;13:工厂方法模式;14:抽象工厂模式;15:单例模式;16:单例模式与MX记录;17:多例模式;18:序列健生成器与单例及...

    面向对象设计原则java

    详细介绍了: 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则

    软件体系结构七大设计原则

    软件体系结构七大设计原则,开闭原则 里氏代换原则 依赖倒转原则 迪米特法则 迪米特法则

    面向对象设计原则

    面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则

    面向对象设计原则PPT

    面向对象设计原则概述 单一职责 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成复用原则 迪米特法则

Global site tag (gtag.js) - Google Analytics