文档章节

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

小贱是个程序员
 小贱是个程序员
发布于 2016/11/20 19:54
字数 498
阅读 160
收藏 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
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
13《Java核心技术》之接口和抽象类有什么区别?

一、提出问题 Java 是非常典型的面向对象语言,曾经有一段时间,程序员整天把面向对象、设计模式挂在嘴边。虽然如今大家对这方面已经不再那么狂热,但是不可否认,掌握面向对象设计原则和技巧...

飞鱼说编程
10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

windows上类似dnsmasq的软件Dual DHCP DNS Server

官网地址:http://dhcp-dns-server.sourceforge.net/官网定向的下载地址:https://sourceforge.net/projects/dhcp-dns-server/files/ 设置参考地址:http://blog.51cto.com/zhukeqiang/18264......

xueyuse0012
今天
3
0
LinkedHashMap源码解析

前言 HashMap中的元素时无序的,也就是说遍历HashMap的时候,顺序和放入的顺序是不一样的。 如果需要有序的Map,就可以采用LinkedHashMap. LinkedHashMap通过维护一个包含所有元素的双向链表,...

grace_233
今天
3
0
初识flask

文档 0.10.1版本 http://www.pythondoc.com/flask/index.html 1.0.2版本 https://dormousehole.readthedocs.io/en/latest/ 安装flask $ pip3 install flaskCollecting flask Downloading......

yimingkeji
昨天
5
0
Akka系统《sixteen》译

Actor是一个封装状态(state)和行为(behavior)的对象,它们只通过交换消息通信(放入收件人邮箱的邮件)。从某种意义上说,Actor是最严格的面向对象编程形式,但它更适合将他们视为人:在与Act...

woshixin
昨天
3
0
技术工坊|如何开发一款以太坊钱包(深圳)

【好消息!】HiBlock区块链技术工坊已经成功举办了26期,其中北京1期,西安1期,成都2期,上海22期。经常有社区的小伙伴问定期举办技术工坊的除了上海以外,其他城市有没有?现在区块链技术工...

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部