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

转载 2012年03月31日 16:34:33

里氏置换原则(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)结果: 子类被执行...

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

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

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

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

里氏置换原则(Liskov Substitution Principle),简称LSP。所有引用基类的地方必须能够透明的使用其子类对象。也就是说,只要父类出现的地方子类就能够出现,而且替换为子类不会产...
  • u013115694
  • u013115694
  • 2013年12月27日 13:25
  • 287

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

里氏置换原则(Liskov Substitution Principle),简称LSP 定义: Functions that use pointers or references to b...
  • kepoon
  • kepoon
  • 2013年09月09日 15:51
  • 770

Java设计模式-设计模式的六种原则

所谓无招胜有招,练一门功夫分为内功和外功。外功好比招式,就是所谓的23种设计模式。而内功呢,就是心法,那就是这6种法则。光会外功那是花拳绣腿,内功修为才是境界。如此众多的设计模式,学完2遍,3遍可能也...
  • cq361106306
  • cq361106306
  • 2014年08月20日 17:13
  • 14727

设计模式(一)设计六大原则

1. 单一职责原则(SRP) 定义:就一个类而言,应该仅有一个引起它变化的原因。 从这句定义我们很难理解它的含义,通俗讲就是我们不要让一个类承担过多的职责。如果一个类承担的职责过多,就...
  • itachi85
  • itachi85
  • 2016年01月10日 16:44
  • 9026

PHP设计模式—六大原则

一般认为遵从以下六大原则的代码是可扩展易维护高复用的代码: 1.单一职责原则 2.开放封闭原则 3.里氏代换原则 4.接口隔离原则 5.依赖倒转原则 6.迪米特法则--最少知道原...
  • sinat_25139121
  • sinat_25139121
  • 2017年02月24日 11:37
  • 329

23种设计模式与6大原则综述

设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无...
  • k605726828
  • k605726828
  • 2015年11月22日 21:27
  • 679

软件设计6大原则

(1) (2)里氏替换原则()Liskov Substitution Principle LSP
  • u012656834
  • u012656834
  • 2014年07月08日 14:42
  • 1220

android之设计模式六大原则

设计模式面向对象软件设计开发模式 目录(?)[-] 设计模式六大原则1单一职责原则设计模式六大原则2里氏替换原则设计模式六大原则3依赖倒置原则设计模式六大原则4接口隔离原则设计模式...
  • wanlong2713
  • wanlong2713
  • 2015年04月17日 09:34
  • 1675

JAVA-6大原则

下面是转自网上的例子,每个都是经过精挑细选过
  • qizhenghao
  • qizhenghao
  • 2014年06月16日 21:29
  • 570

面向对象的六大原则(推荐)收藏

  面向对象的六大原则(推荐)要把软件做得非常灵活又要便于维护是一个很困难的事情。灵活的软件他的结构就复杂,维护起来就困难。有得必有失,关键就在于如何处理这两者,使得大于失。软件的设计开发应遵循以下六...
  • wangjunkg
  • wangjunkg
  • 2009年01月12日 19:26
  • 8706
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式--6大原则--里氏置换原则
举报原因:
原因补充:

(最多只允许输入30个字)