代码复用的几个级别:

  • 源代码级别的复用
  • 模块级别的复用(类/抽象类/接口)
  • 库级别的复用(API)
  • 系统级别的复用:框架

白盒复用:源代码可见、可扩展、可修改
黑盒复用:源代码不可见,只可调用API

找源代码的几个网站:
grepcode.com
github.com
searchcode.com

本文主要介绍模块级别的复用——类/接口
复用一个类的方式——继承、委托

继承

继承时,子类将继承父类的所有功能。
子类可以override父类的功能,也可以在父类的基础上,增加新的功能。
在实现继承类之前,最好先设计好继承层次图
子类不可以丢弃父类的属性或方法,因此在设计继承结构时务必特别小心。

委托(delegation)

委托用于:一个类仅依赖于另一个类的部分功能模块时,例如,Sorter就将一部分功能委托给了Comparator。
显式的委托:把被委托类直接传给委托类
隐式的委托:by the member lookup rules of the language
委托是一种比较低级的共享代码机制。

库级别的复用(API/Package)

库(Library)是一些具有可重用功能的类的集合。
框架(Framework)是一组可以根据应用需求定制的代码骨架。

系统级别的复用(Framework)

框架是一组抽象类、具体类及其链接关系,只有骨架,没有血肉。
开发者根据自己的具体应用需求,在框架中填入代码,形成完整的系统。
白盒框架:通过代码层面的继承来进行框架扩展
黑盒框架:通过实现特定的接口来完成代码复用

LSP可替换原则

行为子类型

  • 子类型可以增加方法,但不能删除方法。
  • 子类型需要实现抽象类型中所有未实现的方法。
  • 子类型方法的返回值类型只能与原方法的返回值类型相同或是其子类型。
    override一个方法时,设父类方法返回值类型是T1,子类方法返回值类型是T2,则T2必须与T1相同,或T2是T1的子类型。
    原因如下,在实现多态时,可能有一个父类对象,用子类型实例化,就可能用一个T1类型的变量用于接收父类方法的返回值,这样在编译时才能通过。那么在runtime,执行的实际上是子类方法,如果子类方法返回的是T1的父类型,则无法被T1类型的变量接收;子类方法如果返回的是T1的子类型,则可以被T1类型的变量接收,这也是一个多态的过程。因此,要求T2是T1的子类型。
  • 子类型方法的参数必须是与原方法参数类型相同或是其父类型(这种情况在Java中按overload处理)
    override一个方法时,设父类方法中参数类型是T1,子类方法参数类型是T2,则T2必须与T1相同,或是T1的父类型,原因如下。
    在实现多态时,可能有一个父类类型的对象,用子类类型实例化。在调用这个方法时,传递的参数,必须是T1或T1的子类型,这样编译才能通过。而在运行时,实际上调用的是子类的方法,如果子类方法要求的参数类型T2是T1的子类型,而父类传入了T1类型,则在运行时,子类方法的参数无法用T2来接收一个T1类型的对象,就会出错。因此,要求子类方法接收的参数类型必须是T1或T1的父类型,这样才能适配多态机制。而在Java中,这样的机制不是override,而是overload。
  • 子类型方法抛出的异常必须少于或等于父类方法抛出的异常
    这个很容易理解,在调用父类方法,只处理了一部分异常使得编译时能通过。而运行时实际上是执行的子类方法,如果抛出了额外的异常,就会导致运行时出现未处理的异常。因此子类方法抛出的异常只能变少不能变多。
  • 子类型的规约必须比父类型规约更强,或相等。
    这就意味着子类型拥有更强的不变量更弱的前置条件更强的后置条件,因为要求父类接收的输入,子类必须也能够接收;子类给出的返回,父类必须也能够处理。这就要求子类接收的输入范围更大、子类给出的输出范围更小。

如何设计复用性较好的类?相关推荐

  1. 架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC

    从本文标题中可以看出,主要说的是反射技术和控制反转(IOC)技术,本文主要先介绍一下我对这两种技术的理解及它们的优缺点,最后再用实例来说一下使用方法. 反射:可以使用反射动态创建类型的实例,将类型绑定 ...

  2. 大中台的黄粱一梦和复用性设计的繁荣盛世

    K8s已经成为一线大厂分布式平台的标配技术.你是不是还在惆怅怎么掌握它?来这里,大型互联网公司一线工程师亲授,不来虚的,直接上手实战,3天时间带你搭建K8s平台,快速学会K8s,点击下方图片可了解培训 ...

  3. 设计模式第二弹: 不知道怎么提高代码复用性?看看这几种设计模式吧!

    本文是设计模式的第二篇文章,第一篇文章是不知道怎么封装代码?看看这几种设计模式吧!,后面还会有提高扩展性,提高代码质量的设计模式,点个关注不迷路,哈哈~ 想必大家都听说过DRY原则,其实就是Don't ...

  4. 关于提高代码复用性的几个知识点的回顾

    在java学习过程中,我发现有几个知识点,它们的作用都包含有提高代码的复用性.所谓提高代码复用性,简单来说就是能够让一个东西重复操作,还能减少工作量(也就是懒人思想).目前提到提高代码复用性的知识点有 ...

  5. 第五章--第三节:设计复用模式(pattern)

    第五章:面向软件构造的可复用性的构建方法 第三节:设计复用模式(pattern) 问题一:复用模式的类型 Creational patterns 创建型模式 Structural patterns 结 ...

  6. 设计一个简单的学生信息类

    设计一个学生信息类 一.任务描述 本关任务:声明并定义一个学生信息类. 二.相关知识 为了完成本关任务,你需要掌握类的声明和定义. 类 在现实世界中,经常有属于同一类的对象.例如,你的自行车只是世界上 ...

  7. java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...

  8. Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类

    Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类) 题目 缺陷 UML图 代码 Test02_MyDate.java:用于参考的My ...

  9. Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出

    10.10(Queue类)10.6节给出一个Stock类,设计一个名为Queue的类用于存储整数 题目 程序 破题 代码 Test10.java Test10_Queue.java UML 题目 程序 ...

最新文章

  1. 一位大神写的js爬虫
  2. angular指令:tm.tags添加/删除标签
  3. python多种推导式的实现
  4. 软件测试——性能测试、压力测试、负载测试等详解
  5. 5句话搞定ES5作用域
  6. session 与 coolie 的区别与联系
  7. Diverse Team(暴力)
  8. 免费Word简历+PPT模板下载网站
  9. 计算机毕业设计(附源码)python智慧医疗系统
  10. 车载注册蓝牙服务器,蓝牙配对码配备方法、系统、终端、服务器及车载设备专利_专利查询 - 天眼查...
  11. Java小农养成记第四天
  12. ARM芯片外围电路介绍
  13. 计算机网络cmda编解,【计算机网络】——信道复用技术,再见了!CDMA
  14. Vivado综合报错及解决方法
  15. 音高修正,对齐软件Synchro Arts 黑五促销
  16. 软件测试工程师的介绍
  17. python 根据经纬度 调取和显示地图_Python调用高德地图API实现经纬度换算、地图可视化-站长资讯中心...
  18. java Timer(定时调用、实现固定时间执行)
  19. 华为数通笔记-SDN和Overlay
  20. K - 十日游戏(排序/优先队列)

热门文章

  1. 疫情启示录:控疫复工背后的数据中心价值,市场这样说
  2. android的文件操作,Android文件操作概要1.ppt
  3. php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例
  4. java打印 a b c,创建一个java程序,按顺序给出3个术语作为输入(a,b,c)打印它们的根...
  5. DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)
  6. VM:如何向vmware虚拟机中传输文件(或者共享文件夹)之详细攻略(图文教程)
  7. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
  8. PHP5.6通过CURL上传图片@符无效的兼容问题
  9. freemarker写入word【未完,待续】
  10. Android IllegalStateException: The specified child already has a parent问题解决办法