OOD教学(Java8)-导航

【内容简介】通过若干典型的实例,介绍面向对象设计的基本原理和设计模式。通过解决问题而“获得”设计模式,以掌握设计模式的本质、揭示设计模式之间的内在联系,以期解决学习设计模式的知易行难困境。

(请收藏。最后编辑时间:2021.2.18)

知乎目录


上机题

三门语言的编程环境 -Pelles c、DrRacket和BlueJ

  • 【实验2.框架设计者】
  • 【实验4.某种条件作为参数】
  • 【实验5 通用累积函数】
  • 【实验6:通过God创建对象】
  • 【实验7 复合函数-桥接模式】
  • 【实验9 表达式问题-访问者和解释器】 Java模拟双分派

第0章 基础

本书讨论面向对象(的软件)设计(Object Orientation Design、OOD),因而需要回答:什么是面向对象或对象抽象,软件设计——不论是命令式语言C、函数式语言Scheme或面向对象语言Java——有什么(共同的)设计理念,OOD又有些什么侧重点(如对象创建、某些设计模式),等等。因此作为本书的开篇,本章说明读者在学习OOD和本书时应该具备的基础,主要包括如下方面。

  • 编程语言基础和面向对象。本书选用Java作为例程的实现语言,并以C和Scheme作为Java的对比语言(读者需要初步了解这两门语言),通过3门语言交叉使用可以更方便地认识软件设计的共同设计理念、厘清一些被搞得莫名其妙的概念/术语。在第0.1节,将详细说明对读者编程语言方面的要求,在第0.1节说明什么是面向对象或对象抽象。
  • 设计原则。在长期的软件设计实践中,人们总结或归纳出诸多的经验,这些经验被称为设计原则——软件设计时需要遵循的一系列理想化的原则。当希望从“公理化思想”出发构建OOD的完整逻辑体系时,需要设定几个基本原则作为“公理”,将它们作为全书的指导性原则。“公理”将在第0.3节介绍,而更为细节的原则,将分布于各个章节中。
  • 第0.4节介绍阅读本书的若干注意事项。

0.1编程语言的掌握

  • 0.1.1 编程语言应该学习什么
  • 0.1.2 行为抽象 @漫谈顺序、分支和循环
  • 0.1.3 数据抽象 @[SICP] 什么是数据抽象
  • 0.1.4 对象抽象——PLP 何谓面向对象编程范式(Object Orientation paradigm )   面向对象编程范式是以柏拉图原则、Liskov原则和Parnas原则(合称PLP-脑图)为基石构建的面向对象范式的逻辑体系。  编程宗派的融合 
  • 0.1.5命令编程范式   命令式编程范式
  • 0.1.6  函数编程范式  

0.2 PLP详解

0.3 设计原则

0.4 关于本书的若干说明

第一章 概念与技术

软件设计的全部,某种程度上,在于应对可变的需求。针对不确定的需求、或者说针对“某种”问题而编程是软件设计的基本研究内容。而OCP的简单推论——“针对接口编程”或抽象依赖原则即是软件设计的基础。本章围绕回调机制,阐述抽象依赖原则的应用。主要包括如下方面。

  • 回调机制的概念和它的两种使用场景:框架和通知。在1.1节首先介绍回调相关概念,并举例说明3门编程语言实现回调机制所用的技术和术语。
  • 在1.2节,深入介绍框架设计中面临的混乱术语,包括回调、控制反转、针对接口编程/抽象依赖原则和好莱坞法则等。建立 OOD 的完整的逻辑体系,需要梳理各种概念,澄清一些错误的认识。
  • 在1.3节中说明通知机制的实现。
  • 在1.4节中探讨为什么OOD领域会充满十分混乱的概念/术语,以及反思和应对。

1.1 回调机制   1.1回调机制(知乎)

  • 1.1.1框架Vs.工具箱
  • 1.1.2回调机制的实现
  • 1.1.3回调函数
  • 1.1.4匿名类和λ表达式

1.2 框架设计者  @【实验2:框架设计者 IoC】

  • 1.2.1起点
  • 1.2.2分离与依赖
  • 1.2.3框架的复用
  • 1.2.4 控制反转
  • 1.2.5 抛弃依赖倒置原则
  • 1.2.6 策略模式(5.9)

1.3 通知机制

  • 1.3.1 轮询VS. 通知
  • 1.3.2 观察者模式
  • 1.3.3 什么是好莱坞法则

1.4 OOD领域的乱象

第2章 行为参数化

在软件开发中,如何应对用户频繁更改的需求是一个永恒的话题。行为参数化的意义或理论基础,就在于函数级别遵循OCP。行为参数化的要点是,当函数中存在可变部分(需求导致的各种变化)时,可以将变化的部分抽取出来,使之变成函数的参数——行为参数,而描述行为参数的最佳术语或许是高阶函数。本章介绍行为参数化相关的议题。

  • 例解行为参数化
  • 模板方法模式(5.10),模板方法模式是行为参数化的基本实现手段
  • 命令模式与行为参数化
  • 函数式编程的启发,介绍高阶函数相关概念
  • Java8的通用函数接口。

2.1 可变的需求被参数化  实验2.行为参数化

  • 2.1.1为什么要将行为作为参数
  • 2.1.2策略模式的扩展
  • 2.1.3条件的组合
  • 2.1.4数据与行为的统一

2.2 模板方法模式(5.10)

  • 2.2.1求和函数 
  • 2.2.2 策略模式Vs. 模板方法模式
  • 2.2.3可变步骤如何设计
  • 2.2.4更强的通用性 累积函数

2.3 命令模式(5.2)

  • 2.3.1 傻傻的幸福
  • 2.3.2 命令模式与行为参数化
  • 2.3.3 万能的适配目标?
  • 2.3.4   适配器模式(4.1) 

2.4 函数式编程风格

  • 2.4.1 函数数据类型Vs. 函数类型签名
  • 2.4.2 柯里化和闭包
  • 2.4.3 惰性求值 

2.5 Java8函数接口简介

第3章 创建对象

在面向对象技术中,对象的创建是一个基础性议题。既要有便捷的创建方式,也要有应对各种复杂情况的对象创建技巧。按照针对接口编程/抽象依赖原则,假定Demo需要依赖抽象类型IMan(后面简写为Demo→IMan),首先需要解决的问题是如何使得Demo依赖抽象类型IMan成为可能。换言之,抽象依赖原则的使能问题是面向对象技术必须解决的基础性问题。

本章介绍对象创建相关的议题。

  • 首先通过工具God,介绍针对接口编程的使能工具。之后介绍更多的使能工具,特别是Spring 的“依赖注入”模块,而该部分本质上仅仅是一个工具箱;
  • 介绍应对各种其他场景的对象创建模式。

3.1 工具类God

  • 3.1.1不得使用new 
  • 3.1.2 针对接口编程的使能工具 工具类God 
  • 3.1.3 ServiceLoader和Lookup

3.2依赖注入容器  

  • 3.2.1 Spring DI的使用和注入的方式   Spring工具的简单使用 
  • 3.2.2 增强的God 依赖注入容器 
  • 3.2.3 参数化工厂模式   2.1.1 简单工厂模式
  • 3.2.4 什么是依赖注入

3.3工厂模式

  • 3.3.1工厂方法模式(3.3)  2.1.2 工厂方法模式(3.3)     静态工厂模式的enum实现 
  • 3.3.2 抽象工厂模式(3.1)

3.4 零例、单例和对象池

第 章 策略模式的演化

多重策略包含的多个策略,在模板方法模式中是彼此独立的,而在桥接模式是嵌套的。(这一章似乎应该并入第二章,但是会不会使得第二章太长?考虑ing....)

4.2 桥接模式

  • 4.2.1多次决策而非多继承
  • 4.2.2 IStyle和参数化
  • 4.2.3 复合函数 实验5 复合函数

第4章 封闭型操作

离散数学中有一个定义:S为非空集合,如果在S上定义的二元运算@(可以推广到n元运算,对于Java引用类型通常为一元运算),对于任意a,b∈S,有a*b∈S,则运算@具有封闭性/Closure。例如对于正整数,+操作是封闭的,而-操作不具有封闭性,因为1-2不是正整数。Closure在第二章中译为闭包,本章称之为封闭性,对应的运算称为封闭性运算或封闭性操作[1]。

封闭性操作拥有强大的组合能力,因为运算的结果可以被该操作符再次运算。Java数据类型中很多操作具有封闭性,如Java基本类型的运算基本上都是封闭的,使得从简单的表达式能够组合出复杂的表达式。本章主要讨论Java引用类型的封闭性操作,主要包括如下方面。

  • 封闭性操作的两种自引用模型。它们是诸多设计模式的基本结构。
  • 桥接模式(4.2)与装饰模式(4.4)。装饰模式是同一个类层次中的桥接模式。
  • 多个数据结构型设计模式
  • 管道型操作以及Java8的流。

5.1 自引用模型

  • 5.1.1 结点
  • 5.1.2 自然数和丘奇数

5.2  装饰模式 5.5 装饰模式(4.4)

5.3 数据结构型模式

  • 责任链模式 6.1 责任链模式(5.1)
  • 组合模式 6.2 组合模式(4.3)
  • 5.3.3 迭代器模式  略

5.4 封闭型方法

5.5 流

第5章 表达式问题

表达式问题(The Expression Problem或扩展性问题the extensibility problem)是编程语言领域的一个根本性的两难困境。

本章通过Java模拟双分派(double dispatch),讨论表达式问题,并自然地获得访问者模式,从而认识访问者模式的本质;然后通过解释器模式(5.3)进一步理解表达式问题。

6.1Java模拟双分派  【6.1.1分派/动态绑定/6.1.2命令和执行/6.1.3合并Shape和命令/6.1.4形状的行为与访问者的类型 】

6.2访问者模式(5.11) 【6.2.1表达式问题  6.2.2对象结构】

6.3解释器模式(5.3)  7.1 解释器模式 解释器模式 2 中序表达式 to 后序表达式

  • 6.3.1乘法解释器
  • 6.3.2 Expr的新子类
  • 6.3.3 Expr的新操作

第6章 LoD

第7章 属性型模式


yqj2065的讲义,一直会调整。

第0章 基础

0.1 面向对象编程范式 脑图
0.1.3 Parnas原则 (接口与实现分离) 《编程导论(Java)·6.1封装性》

0.2 设计原则概述 

0.2.1 开放封闭原则 (类的OCP,参见第2章。函数的OCP,参见第3章。)

 何谓设计模式

第1章 抽象依赖原则

2.3.4 配置文件Vs. 标注 @ 增强tool.God  @

2.3.5 工厂模式 准备将2.1.3 抽象工厂模式(3.1) 压缩为一节。

2.4 其他创建型模式 

2.4 .1装配厂模式 2.2.1 伪建造者模式
2.2.2 建造者模式(3.2)
2.2.3 串接式setter模式 略

2.4.3  原型模式(3.4)

第4章 行为参数化 

值参数化  4.1.2 强大的动态绑定 4.1.3 行为参数化 4.1.4 回调机制(Call back) 

4.1单向依赖原则 @好莱坞原则 最简单的Java框架 

4.3模板方法模式   @传统模板方法模式(5.10)   +显式回调  脑图
4.4 桥接模式(4.2) 

4.6 观察者模式(5.7) 

5.3   5.3.3 可插入的适配器(Pluggable Adapter)

3.4 命令模式(5.2)   命令模式之2 Invoker Vs. Client   模拟双分派  命令模式(5.2)的结构推导
3.5 访问者模式(5.11)  访问者模式的意图  访问者模式与双分派   访问者模式(5.11)之对象结构  访问者模式-好人打贱人(这么分散!)

3.7 Null对象  略


第5章 属性型模式 

4.1虚域模式  略
4.3享元模式(4.6)
4.2 状态模式(5.8) 有限状态机

4.5 备忘录模式(5.6)

第6章 委派型模式 154

5.1 小方法模式  略
5.2 代理模式(4.7) 

5.2.1保护型代理(protection proxy) 106
5.2.2动态代理(dynamic proxy) 106
5.2.3 Java RMI (Remote Method Invocation,远程方法调用) 106


5.6 外观模式(4.5)
5.7中介模式(5.5)


附录
附录A Astah Community
附录B 模式映射表
附录C参考资料

在讲授“信息系统分析与设计”课程的时候,需要介绍一些设计模式;又由于在[编程导论]出版过程中,清华大学出版社的魏江江主任给我寄来了两本设计模式方面的书籍,因而yqj2065决定将设计模式方面的知识全面梳理一番。

 ①推导出常用的设计模式。
GoF在[设计模式•引言]中写道:“这本书的目的就是将面向对象软件的设计经验作为设计模式记录下来”。这种“记录”或者说归纳,对于广大程序员成功地共享设计经验作出了重大贡献。然而,将设计模式作为前辈的经验总结或者既定事实,对于学习设计模式,特别是能够灵活使用设计模式是一个错误的诱导。许多设计模式的学习者如同拿一本字典学习英语一样。

本系列的基本方法是从各种假定出发,通过重构源代码或者遵循设计原则的编写源代码,以获得设计模式。
虽然有点像作弊——知道最终结果的推导和证明,然而在推导的过程中,我们能够看到一个模式更多的变化、能够知道一个模式的优缺点/适应性、能够知道一个模式与其他模式的思路上的关联(而不是UML类图结构上的形似)。


②解释更清晰和简明。这是站在巨人的肩膀上,对巨人的经典加以吹毛求疵。
以我对面向对象的认识,[设计模式]中有许多解释显得晦涩、不严密、甚至错误。一个典型的例子是[设计模式]使用回调/好莱坞法则解释模板方法模式(5.10),而在我看来,观察者模式则是回调/好莱坞法则的简单推论。[设计模式]对桥接模式(4.2)的解说非常难解。再例如,我认为备忘录模式(5.6)Memento对象可以是不变对象,不必要强调“封装性”。


③补充常用的模式。如依赖注入等。

④以内在的联系,将若干模式串联起来...


2017.02.20:汇集20:16-2017-1学期的教学资料(32授课学时+12上机学时)。重新修改了许多博文内容。

(yqj2065提示:不时编辑中,转载请谨慎。欢迎拍砖。)

2014-2015-2试题

23字真经

如何学习设计模式

 学习难度系数排名

 乒乓球问题

你可能感兴趣的:(导航,OOD与设计模式,Java,编程导论,设计模式,面向对象设计,导航)