设计模式 里氏替换原则
继续里氏替换原则。
上回栗子为正方形不能被长方形继承,这次,具体

子类必须实现父类的方法

类图

对具体代码进行实践

// 定义抽象类枪
public abstract class AbstractGun{// 定义枪public abstract void shoot();
}
// 定义手枪,步枪,机枪
public class Handgun extends AbstractGun{// 定义手枪public void shoot(){}
}
public class Rifle extends AbstractGun{public void shoot(){}
}
public class MachineGun extends AbstractGun{public void shoot(){}
}

接着拥有枪,定义士兵

public class Soldier{// 让其获得具体的枪的对象private AbstractGun gun;// 给其一把枪public void setGun(AbstractGUn _gun){this.gun = _gun;}// 定义杀敌的行为public void killEnemy(){gun.shoot(); // 使用对象的shoot方法}
}

最后定义整个场景

public class Client{public static void main(String[] args){// 产生士兵Soldier sanMao = new Soldier();// 给其一只枪sanMao.setGun(new Rifle());// 杀敌sanMao.killEnemy();}
}

在场景中,三毛需要什么枪支,就直接new 出一个枪支即可,然后其内通过抽象类获取到对象,然后对齐进行修饰

装饰器模式

更改枪支

如果要更改枪支,直接增加新的类即可

由于玩具枪不能射击,所以代码如下

public class ToyGun extends AbstractGun {public void shoot(){}
}

对参加进行修改

public class Client{public static void main(String[] args){Soldier sanMao = new Soldier();sanMao.setGun(new ToyGun());sanMao.killEnemy();}
}

由于之前在士兵类中定义了shoot方法,导致三毛杀敌,业务出现问题
解决,只能再次定义一个新的玩具枪的抽象类和强的抽象类之间存在泛化关系

子类可以拥有行为和外观

对步枪继续继承一些类,该类更加详细

实现以下AUG类

public class AUG extends Rifle {// 对阻击枪设置一个望远镜public void zoomOut(){}// 重写父类的射击方法public void shoot(){}
}

需要增加阻击手和阻击枪之间存在组合关系
uml图如下

实现阻击手

public class Snipper{public void killEnemy(AUG _ang){_ang.zoomOut(); // 先查看情况// 射击ang.shoot();}
}

这就可以啦。在场景中可以杀死敌人

public class Client{public static void main(String[] args){Snipper sanMao = new Snipper();sanMao.setRiffle(new AUG);    // 给三毛一只枪sanMao.killEnemy();    // 进行设计}
}

这里直接将子类传递进入。

Java中向下转型不安全

public class Client{public static void main(String[] args){Snipper sanMao = new Snipper();sanMao.setRiffle(new AUG);    // 给三毛一只枪sanMao.killEnemy();    // 进行设计}
}

好吧,在子类出现的地方,父类未必就可以出现。。。向下强制转型,不安全

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

里式替换原则要求定义一个契约,即父类或接口,即契约设计。

// 定义一个转换类
public class Father{public Collection doSomething(HashMap map){return map.values();}
}

这个类完成转换
然后定义子类

public class Son extends Father {// 将输入放大public Collection doSomething(Map map){return map.value();}
}

然后接着使用

public class Client{public static void main(String args){// new 出父类Father f = new Father();HashMap map = new HashMap();f,doSOmething(map);}
}

在上方中父类被执行
根据里氏替换原则,子类能替代父类

public class Client{public static void main(String[] args){SOn f = new Son();HashMap map = new HashMao();f.doSomething(map);}
}

上方的即为里氏替换原则。
子类代替父类传入,子类永远不会被执行。子类要运行,必须重写父类。或者是参数的范围更宽
举例子,如果父类参数条件大,子类参数条件小

public class Father{public Collection doSomething(Map map){return map.values();}
}
public class Son extends Father{public Collection doSomething(HashMap map){return map.values();}
}

接着运行

public class Client{public static void main(String[] args){Father f = new Father();HashMap map = new HashMap();f.doSomething(map);}
}

此时可以运行
根据里氏替换原则,子类能使用的地方,父类也能使用。

public class Client{public static void main(String[] args){Son f = new Son();HashMap map = new HashMap();f.doSomething(map);}
}

子类被执行,

总结

重载实现父类的时候,输入的参数要求放大
重写,实现父类的时候可以缩小。
www.iming.info

设计模式 里氏替换原则相关推荐

  1. 设计模式-里氏替换原则

    设计模式-里氏替换原则 优点 面向对象的语言继承必不可少的,有如下优点 代码共享,减少创建类的工作量 提高代码的重用性 提高代码的可扩展性 提高代码的可扩展性 提高产品代码的开放性 继承侵入性 只要继 ...

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

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

  3. 《设计模式》杂记之里氏替换原则

    在这篇博文中,我想把自己学习过的里氏替换原则一些好知识点分享给大家.首先我想把继承的一下优缺点给大家分享一下,然后再引出里氏替换原则吧!<?xml:namespace prefix = o ns ...

  4. 里氏替换原则——举例说明Java设计模式中的里氏替换原则

    里氏替换原则--举例说明Java设计模式中的里氏替换原则 1. 前言 官方定义: 2. 举例说明 2.1 例子介绍 2.2 反例 2.2.1 类图说明 2.2.2 代码说明 2.2.3 测试 2.2. ...

  5. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  6. Java设计模式(03) -- 里氏替换原则

    六大设计原则 单一职责原则定义:约定一个类应该有且仅有一个改变类的原因: 开闭原则定义:规定软件中的对象.类.模块和函数对扩展应该是开放的,但对于修改是封闭的,核心思想也可以理解为面向抽象编程. 里氏 ...

  7. 《设计模式》——里氏替换原则

    先扯两句 原本是不想扯了的,因为很久没扯了也不知道该说写什么,可是这里氏替换原则东西实在是太多了,我看过都快一周了,但是每次想写博客的时候,都写几个字就扔下了,倒不是说书中的内容不够详细,只是如果都是 ...

  8. java设计模式3,里氏替换原则

    目录 一.里氏替换原则定义 二.里氏替换原则的作用 三.违背原则场景 四.里氏替换原则改变代码 1.抽象人物类 2.哪吒子类 3.敖丙子类 五.关注公众号哪吒编程,回复1024,获取Java学习资料, ...

  9. 「设计模式」六大原则之三:里氏替换原则小结

    文章目录 1.里式替换原则定义 2. 举例说明 示例1: 示例2: 3. 哪些代码明显违背了 LSP? 子类违背父类声明要实现的功能 子类违背父类对输入.输出.异常的约定 子类违背父类注释中所罗列的任 ...

最新文章

  1. COSO企业风险管理框架2017版发布!看看有哪些变化?
  2. ssh 三者集合的思想
  3. JSP九大内置对象(转载)
  4. JavaScript的求模、取整、小数的取舍
  5. python使用opencv会蓝屏_Opencv和DirectShow一起做蓝屏抠像
  6. Current在Java里面_在C#中相当于Java System.currentTimeMillis()
  7. 无法用php smtp发送邮件. 您的服务器可能没有配置用此方法_补充:Web自动化邮件发送...
  8. vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页
  9. github安卓版下载_Pandownload安卓版+IDM神器,手机还有下载不了的资源吗?
  10. 基于vue+ts实现的svg可视化web组态编辑器
  11. 饭店流量预测-多表关联+lightgbm
  12. 微信公众平台接入广告投放系统
  13. 云计算概念简述(讲解)
  14. ubuntu 16.04默认进入guest账户解决办法
  15. H264BSAnalyzer 使用方法
  16. GNSS 周跳探测方法 之 TurboEdit
  17. .NET发送邮箱(验证码)
  18. 芯片供应商:芯片一级供应商分类和安全芯片库存
  19. wilcoxon rank sum test R代码
  20. uniapp、vue实现滑动拼图验证码

热门文章

  1. Android 启动过程简析(一)之 init 进程
  2. 用vue和node写的简易购物车
  3. 代理模式、动态代理及其应用
  4. 微软阵营企稳的利好消息:.NET开源、Visual Studio免费
  5. 网络(8)-HTTP、Socket、TCP、UDP的区别和联系
  6. 程序员的进阶课-架构师之路(10)-霍夫曼树
  7. VS2010连接MySql数据库时无法选择mysql database数据源
  8. 海致星图2022校招算法笔试题
  9. SublimeNFFT:Sublime Text 2从模板新建文件的插件
  10. 分布式锁实现方式介绍和Zookeeper实现原理