当前位置: 首页 > >

OOD教学(Java8)-导航

发布时间:

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


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



上机题

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


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

第0章 基础

本书讨论面向对象(的软件)设计(Object Orientation Design、OOD)。在本书的开篇,需要说明读者在学*OOD和本书时应该具备的基础,主要包括如下方面。


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

0.1编程语言的掌握


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

0.2?编程范式


0.2.1?范式? ?编程宗派的融合(从范式,到编程范式,到编程宗派(风格)0.2.2??命令编程范式?命令式编程范式0.2.3??函数编程范式??

0.3?PLP详解


0.4?设计原则


0.5 关于本书的若干说明


第一章 概念与技术

软件设计,特别是OOD领域,充满概念/术语,而且十分混乱。如果要建立 OOD 的完整的逻辑体系,就需要梳理各种概念,澄清一些错误的认识。


本章首先在1.1节介绍回调机制,随后将介绍回调机制的两种使用场景:框架和好莱坞法则。围绕回调机*得鱋OD中常用的若干概念的含义,这些概念包括:框架、控制反转、针对接口编程/抽象依赖原则和好莱坞法则等。


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领域的乱象



1.5 本章小结


第2章 行为参数化

函数是各种编程语言都需要提供的行为抽象的基本抽象机制。对于函数的设计和使用,人们*惯使用数据参数??值参数,它符合人们数学计算的*惯,如sin(x),以x数值作为参数。而在软件开发中,如何应对用户频繁更改的需求是一个永恒的话题。本章讨论更为有趣的“行为参数”,即把代码作为参数。


行为参数化的意义/理论基础,是在函数级别遵循OCP。


本章介绍行为参数化相关的议题。包括什么是行为参数化、模板方法模式(5.10)和高阶函数等内容。


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 高阶函数


2.3.1函数数据类型Vs. 函数类型签名2.3.2闭包2.3.3柯里化2.3.4 延迟/惰性计算?

2.4 Java8函数接口简介


?


第3章 创建对象

在面向对象技术中,对象的创建是一个基础性议题。既要有便捷的创建方式,也要有应对各种复杂情况的创建技巧。


按照针对接口编程/抽象依赖原则,假定Client需要依赖抽象类型IServer (后面简写为Client→IServer),除了让Client的用户传入IServer对象之外,Client如何通过“国产”方式来初始化IServer对象,使得Client依赖抽象类型IServer成为可能呢?


本章首先通过工具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 零例、单例和对象池


第4章 策略模式的演化

在[第二章行为参数化2.2模板方法模式(5.10)]中,通过设计求和函数,介绍了策略模式的扩展。在例程2-3中solve(int x, Condition c)采用了策略模式;而模板方法中参数可以变成多个,模板方法模式(5.10)因此作为策略模式的推广。


多重策略包含的多个策略,在模板方法模式中是彼此独立的,而在桥接模式是嵌套的。


(这一章似乎应该并入第二章,但是会不会使得第二章太长?考虑ing....)


?


4.1 命令模式(5.2)


4.1.1 傻傻的幸福4.1.2 命令模式与行为参数化4.1.3?万能的适配目标?4.1.4???适配器模式(4.1)?

4.2?桥接模式


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

?


?


第5章 封闭型操作

如果在集合X上有某个运算应用于元素,计算的结果仍然属于X,则称集合X对于该操作是封闭的。SICP称该操作具有闭包属性(closure):『In general, an operation for combining data objects satisfies the closure property if the results of combining things with that operation can themselves be combined using the same operation』。具有封闭特点的操作拥有强大的组合能力,因为操作的结果可以被该操作再次操作。例如对于正整数,+操作是封闭的,是闭包操作;而-操作不是闭包操作,因为1-2不是正整数。由于第二章中已经有了闭包概念,因此SICP的闭包,本章称之为封闭型操作。


Java数据类型中很多操作具有封闭特点。例如Java基本类型的操作基本上都是封闭的,使得从简单的表达式能够组合出复杂的表达式。本章讨论Java引用类型的封闭型操作。


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 流


?


第6章 表达式问题

表达式问题(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的新操作

?


第7章 LoD

?


第8章 属性型模式

?



yqj2065的讲义,一直会调整。


第0章 基础



0.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.4.3 ?原型模式(3.4)




?


第4章 行为参数化?



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




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


4.3模板方法模式 ??@传统模板方法模式(5.10)? ?+显式回调 ?脑图

4.6 观察者模式(5.7)?




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


3.4 命令模式(5.2)? ?命令模式之2 Invoker Vs. Client? ?模拟双分派??命令模式(5.2)的结构推导



第5章 属性型模式?



4.1虚域模式 ?略
4.3享元模式(4.6)

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









附录
附录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字真经?


如何学*设计模式


?学*难度系数排名


?乒乓球问题



友情链接: