`
雨打蕉叶
  • 浏览: 232242 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

设计模式6大原则:里氏置换原则

 
阅读更多

里氏置换原则(Liskov Substitution Principle),简称LSP

定义:

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

所有引用基类的地方必须能够透明的使用其子类对象。

也就是说,只要父类出现的地方子类就能够出现,而且替换为子类不会产生任何错误或异常。但是反过来,子类出现的地方,替换为父类就可能出现问题了。

这个原则是为良好的继承定义一个规范,简单的讲,有4层含义:

一、子类必须完全实现父类的方法

定义一个抽象类

public abstract class ViewPoint {  
    //去丽江旅游  
    public abstract void where();  
} 

 下面两个类是实现这个抽象类

public class Lijiang extends ViewPoint {  
    @Override
    public void where() {  
        System.out.println("欢迎来到丽江...");  
    }  
}  
public class Zhangjiajie extends ViewPoint {  
    @Override 
    public void where() {  
        System.out.println("欢迎来到张家界...");  
    }  
} 

 

人物是涂涂,在里面设置类类型来传递参数。此时涂涂要去的旅游景点还是抽象的

 

public class Tutu {  


    //定义要旅游的景点  


    private ViewPoint viewpoint;  


    //涂涂要去的景点  


    public void setViewPoint(ViewPoint viewpoint)  {  
        this.viewpoint = viewpoint;  
    }  
    public void travelTo()  {  
        System.out.println("涂涂要去旅游了");  
        viewpoint.where();  
    }  
} 

 场景类。设置具体要去的景点

 

public class Sence {  
    public static void main(String args[])  {  
      Tutu tutu = new Tutu();  
        //设置要去的旅游景点  
        tutu.setViewPoint(new Lijiang());  
        tutu.travelTo();  
    }  

} 

 运行结果:

涂涂要去旅游了
欢迎来到丽江...

二、子类可以有自己的特性

也就是说在类的子类上,可以定义其他的方法或属性

三、覆盖或者实现父类的方法时输入参数可以被放大

父类能够存在的地方,子类就能存在,并且不会对运行结果有变动。反之则不行。

父类,say()里面的参数是HashMap类型,是Map类型的子类型。(因为子类的范围应该比父类大)

 

import java.util.Collection;  
import java.util.HashMap;  
public class Father {  
    public Collection say(HashMap map)  
    {  
        System.out.println("父类被执行...");  
        return map.values();  
    }  
} 
 

子类,say()里面的参数变成了Map类型,Map范围比HashMap类型大,符合LSP原则。注意这里的say不是覆写父类的say,因为参数类型不同。而是重载。

 

import java.util.Collection;  
import java.util.Map;  
/*  

 * 子类继承了父类的所有属性  

 */ 
public class Son extends Father {  
    //方法输入参数类型  
    public Collection say(Map map)  {  
        System.out.println("子类被执行...");  
       return map.values(); 
    }  
} 

 

场景类

 

import java.util.HashMap;  
public class Home {  
    public static void main(String args[])  {  
        invoke();  
    }  
    public static void invoke()  {  
        //父类存在的地方,子类就应该能够存在  
        //Father f = new Father();  
        Son s = new Son();  
        HashMap map = new HashMap();  
        //f.say(map);  
        s.say(map);  
    }  
} 

 

无论是用父类还是子类调用say方法,得到的结果都是

父类被执行...

但是,如果将上面Father里的say参数改为Map,子类Son里的say参数改为HashMap,得到的结果就变成了

f.say(map)结果:父类被执行...

s.say(map)结果: 子类被执行...

这样会造成逻辑混乱。所以子类中方法的前置条件必须与父类中被覆写的前置条件相同或者更宽。

四、覆写或者实现父类的方法时输出结果可以被缩小

其实与上面的类似,也就是父类能出现的地方子类就可以出现,而且替换为子类不会产生任何错误或者异常,使用者也无需知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就适应。(毕竟子类的范围要>=父类的范围)

分享到:
评论

相关推荐

    设计模式六大原则

    设计模式六大原则(1):...设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则(6):开闭原则

    设计模式之里氏转换原则

    设计模式之里氏转换原则

    设计模式6大原则

    设计模式原则:单一职责原则,里氏替换,依赖倒转,接口隔离,开放关闭等等。

    设计模式六大原则.doc

    设计模式六大原则(1):...设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大原则(6):开闭原则

    设计模式6大原则.doc

    设计模式六大原则:单一职责模式、开闭原则、接口隔离原则、里氏替换原则、依赖倒置原则、迪米特法则

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

    二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序...

    设计模式之六大原则详解,Markdown笔记

    详细介绍了设计模式六大原则,配有示例代码和图片,有开闭原则,单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则等等。

    php 设计模式六大原则

    php 设计模式六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 word版

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

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

    设计原则与设计模式

    面向对象设计原则:面向对象设计原则、开闭原则、里氏替换原则、里氏替换原则、里氏替换原则

    JAVA设计模式六大原则详细讲解(面向对象语言通用)

    1.单一职责原则: 不要存在多于一个导致类变更的原因 ...接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。

    设计模式六大原则 设计模式详解

    详细介绍设计模式的六大原则,有不足之处希望大家多指教。参考《设计模式之禅》

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

    详细描述全部(23种)设计模式与设计原则(6种)。 (一)设计原则包括: 1、开闭原则 2、里氏代换原则 3、依赖转换原则 4、接口隔离原则 5、合成/聚合复用原则 6、最少知识原则 (二)设计模式 1)工厂模式...

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

    策略模式[STRATEGY PATTERN] 代理模式[PROXY PATTERN] 单例模式[SINGLETON PATTERN] 多例模式[MULTITION PATTERN] ...六大设计原则:单一职责原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则,开闭原则。

    设计模式(六)之里氏替换原则.zip

    里氏替换原则有如下特点: 代码共享,减少创建类的工作量 提高代码的重用性 提高代码的可扩展性 提高产品代码的开放性 继承侵入性 只要继承,必须拥有父类的内容 降低代码的灵活性,子类必须拥有...

    Head First 设计模式 JAVA源码

    所有的设计模式Java实现。 第一讲:简单工厂模式 第二讲:工厂方法模式 第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 第七讲:建造者模式 第八讲:装饰模式 第...

    第一章设计模式与七大原则.doc

    第一章设计模式与七大原则笔记,自己看网课写的,需要的关注拿一下吧,23种设计模式,背后其实是七大设计原则,也就是说,每个设计模式都归属于一个或多个设计原则7大设计原则:a单一职责原则 b里氏替换 c依赖倒置...

    设计模式整体框架与结构

    原则:设计模式遵循六大原则,包括开闭原则、里氏替换原则、依赖倒置原则等,这些原则指导开发者如何正确地应用设计模式。 常用模式:例如单例模式、工厂模式、观察者模式等,每种模式都有其特定的应用场景和解决的...

Global site tag (gtag.js) - Google Analytics