文档章节

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

小贱是个程序员
 小贱是个程序员
发布于 2016/11/20 19:54
字数 498
阅读 155
收藏 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
JAVA程序员应该了解的10个面向对象设计原则

原则1:DRY(Don't repeat yourself) 即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要在两个以上的地方使...

吴远盈
2012/05/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Future,Thread,Callable,Executors.newXXXThreadPool

package cunrent.future;import java.util.concurrent.*;public class FutureCook { public static void main(String[] args) throws InterruptedException, ExecutionExcept......

noteman
30分钟前
2
0
shing boot 做session共享 redis

因为多台服务器负载均衡,在获取客户端的sessionId的时候,会出现第一次和第二次不一样,因为负载均衡的缘故,你的服务器最少两台,那么客户端连接第一次请求和第二次请求如果不是同一台服务...

小马_wolf
34分钟前
1
0
【Springboot+mybatis】 解析Excel并批量导入到数据库

【Springboot+mybatis】 解析Excel并批量导入到数据库置顶 2018年01月16日 20:05:52 冉野丶 阅读数:4060 标签: excel导入数据库 文件上传 excel解析 更多个人分类: POI 工作问题归纳...

奥特曼之王
36分钟前
2
0
Mac OS下安装Axure RP 8.0.0.3312 中文破解版

Mac下一款快速原型设计工具——Axure RP,有了它可以大大提高你的工作效率。此次带来的是Axure RP 8.0.0.3312 版本。 介绍 Axure RP 能帮助网站需求设计者,快捷而简便的创建基于网站构架图的...

james_laughing
38分钟前
1
0
【Guava】使用Guava的RateLimiter做限流

一、常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法。 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出...

大海201506
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部