可复用性

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

行为子结构

对于父子的继承关系的要求:

·子类可以增加方法,但不可以删

·子类需实现抽象类型中未实现的方法

·子类重写(override)的方法必须有相同的返回值和参数列表

·子类不能抛出额外的异常

对于具体的方法:

·更强的不变量

·更弱的前置条件

·更强的后置条件

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

协变与逆变

协变:从父类型到子类型,返回值或异常的类型不变或变得更具体

逆变:从父类型到子类型,参数变得越来越抽象(不允许)

不变:只是重写了方法

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

【LSP】

子类可以扩展父类的功能,但不能修改父类原有的功能

子类可以有自己的个性

子类覆盖或实现父类的方法时输入参数可以变抽象,返回值变具体

(留坑)

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

子类只需要复用父类中的一小部分方法,可以不需要通过继承,而通过委派来完成

组合的例子:

对于不同的子类对象,委派能计算它的奖金的方法,就不需要在子类继承的时候每个子类里都进行重写

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

【可复用的设计模式】

  • 结构型模式:Structural patterns

    • 适配器模式(Adapter)
    • 装饰器模式(Decorator )
    • 外观模式(Facade)
  • 行为类模式:Behavioral patterns 
    • 策略模式(Strategy)
    • 模板方法模式(Template method)
    • 迭代器模式( Iterator)

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

结构型模式:

适配器模式 Adaptor

增加一个接口,将已存在的子类封装起来,client面向接口编程

装饰器模式 Decorator

替代继承,向一个现有的类中添加新的功能

这种模式创建了一个装饰类,用来包装原有的类

Stack s = new ArrayStack(); //构建一个普通的堆栈
UndoStack s = new UndoStack(new ArrayStack()); //构建撤消堆栈
SecureStack s = new SecureStack( new SynchronizedStack( new UndoStack(s)))//构建安全的同步撤消堆栈

这样一层层的实现就是Decorator模式

外观模式 Facade

提供一个统一的接口来代替小接口的调用,相当于对复杂系统做了封装,供客户端简洁的使用

┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉

行为型模式:

策略模式 Strategy

创建表示各种模式的对象和一个行为随着不同对象策略而改变的context,策略对象改变context执行的算法

public interface AStrategy {
public abstract a();
}
// 一个策略对象
public class B implements AStrategy { // 还可以有 C D 等等不同的策略对象
// fields
// Constructor
@Override
public double a() {
// 不同的策略对象这里不一样
}
} public class AContext {
public double a(AStrategy aStrategy) {
return aStrategy.a();
}
} public class Main {
AContext context = new AContext();
double ans = context.a(new AStrategy() {});
}

模板模式 Template

抽象类定义执行它的方法/模式,子类按照需要重写方法,但调用以抽象类中的方法调用

public abstract class Edge {
// fields
public abstract boolean a();
} public class DirectedEdge extends Edge {
// different fields //constructor @Override
public boolean a() {
// method
}
}

迭代器模式 Iterator

顺序访问集合对象中的元素,又不暴露对象的内部表示

让集合类实现Iterable接口,重写 next(), hasNext(), remove()

感谢神仙!!!https://www.cnblogs.com/hithongming/p/8481372.html

SC || Chapter 5 复习向的更多相关文章

  1. SC || Chapter 8

    栈:方法调用和局部变量的存储位置,保存基本类型 堆:在一块内存里分为多个小块,每块包含 一个对象,或者未被占用

  2. SC || Chapter 3

    ┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 基本数据类型 && 对象数据类型 基本数据类型(int char long) 在栈中分配内存,不可变 对象数据类型(String BigInt ...

  3. SC || Chapter 1

    第一章的重中之重就是这张图吧 (具体参见笔记) ┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 区分哪些属性是外部的(面向用户 ...

  4. SC || Chapter6 复习向 面向可维护性 我哭了

    高内聚低耦合 高内聚:一个模块内部各个元素彼此结合的紧密程度,一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则 低耦合:各模块间相互联系紧密程度,模块间接口的复杂性.调用 ...

  5. HDOJ(HDU) 2078 复习时间

    Problem Description 为了能过个好年,xhd开始复习了,于是每天晚上背着书往教室跑.xhd复习有个习惯,在复习完一门课后,他总是挑一门更简单的课进行复习,而他复习这门课的效率为两门课 ...

  6. USACO Chapter 1 解题总结

    USACO Chapter 1 解题总结 1.1.1 Your Ride Is Here 基本字符串操作,无压力. 1.1.2 Greedy Gift Givers 基础模拟题,弄明白题意,不怕麻烦, ...

  7. sql语法复习:增删查改,各种数据库对象创建和函数使用

    推荐工具:机子配置较低的话,可以装Gsql这个工具获得sql执行环境(可作为手册查看内置数据类型 函数和存储过程等) --之前数据库的东西接触不多,虽然基本的语法是了解,但不是很熟悉--最近项目一直在 ...

  8. Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services

    本文内容为转载,供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Servi ...

  9. Chapter 3. Programming with RDDs

     Programming with RDDs This chapter introduces Spark's core abstraction for working with data, the r ...

随机推荐

  1. JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String

    在使用Postman测试Spring Boot项目接口时,接口返回JSON parse error: Cannot deserialize value of type `java.time.Local ...

  2. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) - filter(5)

    自定义fieldType时,通常还会用到filter.filter必须跟在tokenizer或其它filter之后.如: <fieldType> <analyzer> < ...

  3. HTTP之间的区别和特性

    一. Http 简介 Http,学名超文本传输协议 它理解起来并不复杂,平时并不起眼,但经常使用; 前后端交互,多数依赖于http协议,重要性看个人理解,我不敢使用个人认为不掌握的技术; 二. HTT ...

  4. 关于Struts漏洞工具的使用

    最新struts-scan资源: https://www.cesafe.com/3486.html 一,将资源下载后,放入liunx系统中,并且需要具备python2的操作环境 二,打开终端使用如下命 ...

  5. 第九组 通信3班 063 OSPFv2与OSPFv3综合实验

    实验目的 1. 掌握 OSPFv3(v2) 的配置方法 2. 掌握在帧中继环境下 OSPFv3 (v2)的配置方法 3. 掌握 OSPFv3(v2) NSSA 的配置方法 4. 掌握外部路由汇总的配置 ...

  6. day7计算作业详解

    1.day7题目 1.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数, 例如: 153 = 13 + 53 + 3**3 2.给 ...

  7. 第八届蓝桥杯大赛个人赛决赛(软件类)真题C++

    哥德巴赫分解 哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和. 你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行. 实际上,一般一个偶数会有多种不同的分解方案, ...

  8. SpringBoot---Web开发---Thymeleaf模板引擎

    一.前言 1.JSP在内嵌的Servlet容器中运行有一些问题: 1.1 内嵌的Tomcat.Jetty不支持以jar形式运行JSP: 2.2 Undertow不支持JSP: 2.SpringBoot ...

  9. 【踩坑】springMVC 接收String参数没有判断为空

    今天在调试iReview项目的接口时,发现新增词条和新增库的时候,某些字段即使留空POST到后台时也能当做不为空. 经过排查,发现后台是使用 String 变量名 == null 这样的语句去判断变量 ...

  10. AJPFX关于JAVA StringBuffer的用法总结

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...