文档章节

java设计原则之里氏替换原则

小贱是个程序员
 小贱是个程序员
发布于 2016/11/20 19:54
字数 498
阅读 165
收藏 0

What 

  Liskov Substitution Principle(LSP),任何父类出现的地方,子类一定可以出现。

  Why

  LSP是OCP原则的规范。OCP原则的关键的是抽象,而继承关系又是抽象的一种具体表现。

  How

  当子类不能完整的实现父类父类的方法,那么建议断开父子关系,采用依赖,聚合,组合等关系替代继承。下面是一个经典例子,鸵鸟不是鸟

  抽象鸟类,这里我们认为鸟类都会飞,抽象方法是获取飞行速度

abstract class Bird : IFLy
    {
        Wing[] wings;
        public Bird()
        {
            wings = new Wing[2];
        }

        protected abstract double GetFlightSpeed();

        //飞行一段距离所需时间
        public double Fly(double distance)
        {
            return distance / GetFlightSpeed();
        }
    }

燕子类,飞行速度是120

class Swallow : Bird
    {
        protected override double GetFlightSpeed()
        {
            return 120d;
        }
    }

鸵鸟类,鸵鸟不会飞,那么飞行速度是0

class Ostrich : Bird
    {
        protected override double GetFlightSpeed()
        {
            return 0d;
        }
    }

客户端调用

 class Program
    {
        static void Main(string[] args)
        {
            Bird bird = new Swallow();
            Double distance = 100;
            string time = bird.Fly(distance).ToString();
            Console.WriteLine(time);
            Console.ReadLine();
        }
    }

这样看是没有问题的,但是当换成下列这样的情况

 class Program
    {
        static void Main(string[] args)
        {
            Bird bird = new Ostrich();
            Double distance = 100;
            string time = bird.Fly(distance).ToString();
            Console.WriteLine(time);
            Console.ReadLine();
        }
    }

这样就是违反了LSP,因为鸵鸟并不能实现所有的鸟类功能,因为它不会飞,所以没有飞行速度,那么将来客户端调用的使用,当成一种鸟类飞行,就会造成不可预知的错误。

  为什么会造成这样的情况,其实是因为抽象封装的时候出现了问题,从生态学上来说有翅膀、有羽毛等特点的就是鸟,那么会飞的鸟应该是鸟类的一个分支,所以我们应该重新划分类的职责范围

abstract class Bird
    {
        Wing[] wings;
        public Bird()
        {
            wings = new Wing[2];
        }
    }
abstract class FlyBird : Bird, IFLy
    {
        protected abstract double GetFlightSpeed();

        public double Fly(double distance)
        {
            return distance / GetFlightSpeed();
        }
    }
 class Program
    {
        static void Main(string[] args)
        {
            IFLy flyBird = new Swallow();
            Double distance = 100;
            string time = flyBird.Fly(distance).ToString();
            Console.WriteLine(time);
            Console.ReadLine();
        }
    }

 

本文转载自:http://www.cnblogs.com/XzcBlog/p/4191947.html

共有 人打赏支持
小贱是个程序员
粉丝 3
博文 42
码字总数 18418
作品 0
珠海
程序员
私信 提问
架构中的设计原则之里氏替换原则(LSP) - 《java开发技术-在架构中体验设计模式和算法之美》

里氏替换原则 里氏替换原则的核心思想就是:在任何父类出现的地发都可以用它的子类来替换。英文缩写为LSP。全称Liskov Substitution Principle。 其实里氏替换原则的意思就是:同一个继承体系...

Beaver_
2015/04/22
0
0
Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) 、 Decorator(装饰器)、Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的...

银月光海
2015/03/16
0
0
10个不容错过的Java面向对象设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式,而不重视面向...

牵着蜗牛去西藏
2015/07/16
152
2
Java开发人员需知的十大面向对象设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序设计人员不重视面向对象的分析和设计。甚至还有经验丰富的Java程序员没...

飓风2000
2014/06/21
0
0
Java程序员应了解的10个面向对象设计原则

面向对象设计原则是 OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数 Java 程序员追逐像 Singleton、Decorator、Observer 这样的设计模式,而不重...

effort_fan
2012/04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.6)hadoop2.9.1平台上仓库工具hive2.3.4搭建

上一篇文章介绍了hive的原理以及实现机。本篇博客开始,博主将分享数据仓库hive工具搭建全过程。 一、安装Hive (1)、下载Hive和环境准备: Hive官网地址:http://hive.apache.org/index.html...

em_aaron
10分钟前
1
0
架构师和产品经理的区别

架构师和产品经理工作职责与内容异同如下:   一、架构师主要工作、职责如下:   1、协助部门经理制定相关技术开发规范;   2、带领团队持续改进产品的整体架构、功能模块、开发需求,...

咔咔大韦
34分钟前
3
0
第1章

背景:因为最近在考教师资格证,考的是计算机学科,所以学科考的是:信息技术学科知识与教学能力;因此图书馆借了一本书,把最基本的知识看一遍,为之后的笔试和面试做充足的准备。 大学计算...

怪咖先生forever
今天
1
0
element-ui之el-collapse-transition(折叠展开动画)源码解析学习

项目中发现同事使用了element-ui的el-collapse-transition来做折叠展开效果,打开源码看了下发现挺有意思,来解析学习一番。 el-collapse-transition的引入方式 // fade/zoom 等import 'e...

学霸猫
今天
1
0
解释器模式_实战

前言 解释器模式是什么?这个设计模式其实比较冷门,不太会解释,用例子说明把。解释器模式一般用在sql,xml,json解析等场景。比如说你有一个json对象,你要获取这个对象中任意一个节点的值。...

grace_233
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部