1    代码演练

1.1  继承关系判别(是否是真正意义的继承)

1.2  入参控制

1.3  出参控制

1    代码演练

1.1  继承关系判别(是否是真正意义的继承)(其实我觉得这个例子有点牵强)

1.1.1  反例

结论:

确定继承关系的时候一定要判断好,是否父类的方法子类可以继承。传统意义的正方形是矩形的子类,在这里是不适用的。

测试类1:

package com.geely.design.principle.liskovSubstitutation;

public class TestSquare {
public static void resize(Rectangle rectangle){
while(rectangle.getWidth()<=rectangle.getLength()){
rectangle.setWidth(rectangle.getWidth()+1);
System.out.println("长为"+rectangle.getLength()+"****************宽为"+rectangle.getWidth());
} }
public static void main(String [] args){
Rectangle rectangle = new Rectangle();
rectangle.setWidth(10);
rectangle.setLength(20);
resize(rectangle);
} // public static void main(String [] args){
// Square square = new Square();
// square.setLength(10);
// resize(square);
// }
}

打印结果1:

"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=17363:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.principle.liskovSubstitutation.TestSquare
长为20****************宽为11
长为20****************宽为12
长为20****************宽为13
长为20****************宽为14
长为20****************宽为15
长为20****************宽为16
长为20****************宽为17
长为20****************宽为18
长为20****************宽为19
长为20****************宽为20
长为20****************宽为21 Process finished with exit code 0

测试类2:

package com.geely.design.principle.liskovSubstitutation;

public class TestSquare {
public static void resize(Rectangle rectangle){
while(rectangle.getWidth()<=rectangle.getLength()){
rectangle.setWidth(rectangle.getWidth()+1);
System.out.println("长为"+rectangle.getLength()+"****************宽为"+rectangle.getWidth());
} }
// public static void main(String [] args){
// Rectangle rectangle = new Rectangle();
// rectangle.setWidth(10);
// rectangle.setLength(20);
// resize(rectangle);
// } public static void main(String [] args){
Square square = new Square();
square.setLength(10);
resize(square);
}
}

打印结果2:

**************************************
长为241350****************宽为241350
长为241351****************宽为241351
长为241352****************宽为241352
长为241353****************宽为241353
长为241354****************宽为241354
**************************************

矩形类:

package com.geely.design.principle.liskovSubstitutation;

public class Rectangle {
private long length;
private long width; public long getLength() {
return length;
} public void setLength(long length) {
this.length = length;
} public long getWidth() {
return width;
} public void setWidth(long width) {
this.width = width;
}
}

正方形类:

package com.geely.design.principle.liskovSubstitutation;

public class Square extends Rectangle {
private long sideLength; public long getSideLength() {
return sideLength;
} public void setSideLength(long sideLength) {
this.sideLength = sideLength;
} @Override
public long getLength() {
return getSideLength();
} @Override
public void setLength(long length) {
setSideLength(length);
} @Override
public long getWidth() {
return getSideLength();
} @Override
public void setWidth(long width) {
setSideLength(width);
}
}

1.1.2  正方形矩形实现四边形

结论:

子类行为规则应与父类行为规则一致,如果子类达不到这一点,则会违背里氏替换原则,违背里氏替换原则会怎样?继承逻辑混乱,代码不便于维护

测试类:

package com.geely.design.principle.liskovSubstitutation;

public class TestSquare2 {
public static void resize(Rectangle rectangle){
while(rectangle.getWidth()<=rectangle.getLength()){
rectangle.setWidth(rectangle.getWidth()+1);
System.out.println("长为"+rectangle.getLength()+"****************宽为"+rectangle.getWidth());
} }
// public static void main(String [] args){
// Rectangle rectangle = new Rectangle();
// rectangle.setWidth(10);
// rectangle.setLength(20);
// resize(rectangle);
// } public static void main(String [] args){
Square square = new Square();
square.setSideLength(10);
resize(square);
}
}

四边形接口:

package com.geely.design.principle.liskovSubstitutation;

public interface Quadrangle {
long getWidth();
long getLength();
}

矩形类:

package com.geely.design.principle.liskovSubstitutation;

public class Rectangle implements Quadrangle{
private long length;
private long width; public void setLength(long length) {
this.length = length;
} public void setWidth(long width) {
this.width = width;
} @Override
public long getWidth() {
return width;
} @Override
public long getLength() {
return length;
}
}

正方形类:

package com.geely.design.principle.liskovSubstitutation;

public class Square implements Quadrangle{
private long sideLength; public long getSideLength() {
return sideLength;
}
public void setSideLength(long sideLength) {
this.sideLength = sideLength;
} @Override
public long getWidth() {
return sideLength;
} @Override
public long getLength() {
return sideLength;
}
}

1.2  入参控制

1.2.1  里氏替换原则正例

结论:

重载的时候入参更加宽松,可以不引起逻辑的混乱。

测试类:

package com.geely.design.principle.liskovSubstitutation.inputmethod;

import java.util.HashMap;

public class TestChild {
public static void main(String [] args){
Child child = new Child();
HashMap hashMap = new HashMap();
child.method(hashMap);
}
}

子类:

import java.util.HashMap;
import java.util.Map; public class Child extends Base{
// @Override
// public void method(HashMap hashMap) {
// System.out.println("执行子类的HashMap方法");
// } /**
* 子类重载
* 重载的时候入参 Map比 Hashmap宽松,此时执行的时候会执行父类,不执行重载的类
* @param hashMap
*/
public void method(Map Map) {
System.out.println("执行子类Map方法");
}
}

父类:

package com.geely.design.principle.liskovSubstitutation.inputmethod;

import java.util.HashMap;

public class Base {
public void method(HashMap hashMap){
System.out.println("执行父类HashMap方法");
} }

打印结果:

"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=21089:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.principle.liskovSubstitutation.inputmethod.TestChild
执行父类HashMap方法 Process finished with exit code 0

1.2.2  里氏替换原则反例

测试类:

package com.geely.design.principle.liskovSubstitutation.inputmethod;

import java.util.HashMap;

public class TestChild {
public static void main(String [] args){
Child child = new Child();
HashMap hashMap = new HashMap();
child.method(hashMap);
}
}

子类:

package com.geely.design.principle.liskovSubstitutation.inputmethod;

import java.util.HashMap;
import java.util.Map; public class Child extends Base{
// @Override
// public void method(Map map) {
// super.method(map);
// } public void method(HashMap hashMap) {
System.out.println("执行子类HashMap方法");
}
}

父类:

package com.geely.design.principle.liskovSubstitutation.inputmethod;

import java.util.HashMap;
import java.util.Map; public class Base {
public void method(Map map){
System.out.println("执行父类HashMap方法");
} }

打印日志:

"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=21674:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.principle.liskovSubstitutation.inputmethod.TestChild
执行子类HashMap方法 Process finished with exit code 0

1.3  出参控制

1.3.1  反例

结论:

子类的出参如果包含父类,会直接报错。

子类:

package com.geely.design.principle.liskovSubstitutation.outputmethod;

import java.util.Map;

public class Child extends Base {
@Override
public Object method() {
return null;
}
}

父类:

package com.geely.design.principle.liskovSubstitutation.outputmethod;

import java.util.Map;

public abstract class Base {
public abstract Map method();
}

设计模式课程 设计模式精讲 3-10 里氏替换原则coding的更多相关文章

  1. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)

    北风设计模式课程---里氏替换原则(Liskov Substitution Principle) 一.总结 一句话总结: 当衍生类能够完全替代它们的基类时:(Liskov Substitution P ...

  2. &quot;围观&quot;设计模式(2)--里氏替换原则(LSP,Liskov Substitution Principle)

    在面向对象的程序设计中.里氏替换原则(Liskov Substitution principle)是对子类型的特别定义.它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为 ...

  3. Java设计模式(4:里氏替换原则和合成复用原则详解

    一.里氏替换原则 如果说实现开闭原则的关键步骤就是抽象化,那么基类(父类)和子类的继承关系就是抽象化的具体实现,所以里氏替换原则就是对实现抽象化的具体步骤的规范.即:子类可以扩展基类(父类)的功能,但 ...

  4. ZT 设计模式六大原则(2):里氏替换原则

    设计模式六大原则(2):里氏替换原则 分类: 设计模式 2012-02-22 08:46 23330人阅读 评论(41) 收藏 举报 设计模式class扩展string编程2010 肯定有不少人跟我刚 ...

  5. [设计模式]<<设计模式之禅>>关于里氏替换原则

    在面向对象的语言中,继承是必不可少的.非常优秀的语言机制,它有如下优点:● 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性:● 提高代码的重用性:● 子类可以形似父类,但又异于父类,“龙 ...

  6. 设计模式值六大原则——里氏替换原则(LSP)

    里氏替换原则(Liskov Substitution Principel)是解决继承带来的问题. 继承的优点: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性: 提高代码的重用性: 子类 ...

  7. 设计模式六大原则(2):里氏替换原则(Liskov Substitution Principle)

    肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.事实上原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:假设对每 ...

  8. 【设计模式六大原则2】里氏替换原则(Liskov Substitution Principle)

      肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对 ...

  9. 设计模式原则(2)--Liskov Substitution Principle(LSP)--里氏替换原则

    1.定义: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.这一原则与继承紧密相关.如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的 ...

随机推荐

  1. 普及C组第二题(8.4)

    2266. 古代人的难题 (File IO): input:puzzle.in output:puzzle.out 时间限制: 1000 ms  空间限制: 60000 KB 题目: 门打开了, 里面 ...

  2. 解决teamviewer试用期到期的方法

    Teamviewer是一款远程控制软件,使用过程中系统弹出“Teamviewer试用版已到期”的提示, 需要用户购买许可证或延长试用期才能继续使用,解决teamviewer试用期到期问题步骤如下: 出 ...

  3. Python常用数据类型转换

    常用的数据类型转换 目标 了解类型转换的作用 掌握常用的类型转换 函数 说明 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ...

  4. 09-Docker-Volumes数据管理

    目录 09-Docker-Volumes数据管理 参考 数据卷类型 数据卷操作 bind数据卷 volume数据卷 tmpfs数据卷 09-Docker-Volumes数据管理 Docker Vers ...

  5. 一周搞定模拟电路P3_电容_记录

    1 电容的介绍 什么是电容 它有两个电极板,和中间板所夹的介质封装而成,具有特定功能的电子器件. 电容的作用 旁路.去耦.滤波和储能的作用 2 旁路电容的作用 1)使输入电压均匀化,减少噪声对后级的影 ...

  6. HyperLedger Fabric 资料网址大全

    BLOCKCHAIN FOR DEVELOPERS 官方网址 i. 这个网址是ibm给的测试网址,注册进去就可以设置4个节点的区块链,而且有智能合约可以测试 区块链和HyperLedger开源技术讲堂 ...

  7. 吴裕雄 python 机器学习——数据预处理流水线Pipeline模型

    from sklearn.svm import LinearSVC from sklearn.pipeline import Pipeline from sklearn import neighbor ...

  8. 吴裕雄 PYTHON 神经网络——TENSORFLOW 单隐藏层自编码器设计处理MNIST手写数字数据集并使用TensorBord描绘神经网络数据

    import os import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow ...

  9. 【C语言】创建一个函数,判断某一正整数是否为水仙花数,并调用这个函数找出1000以内所有水仙花数

    #include <stdio.h> int fun(int x) { int a, b, c; a = x / ; b = x % / ; c = x % ; if (x == a * ...

  10. 计算机二级-C语言-对标志位的巧妙使用。对二维数组数据进行处理。对文件进行数据输入。

    //函数fun的功能是:计算形参x所指数组中平均值(规定所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于的移至后部,平均值作为返回值,在主函数中输出平均值和后移的数据. //重难 ...