【内容简介】通过若干典型的实例,介绍面向对象设计的基本原理和设计模式。通过解决问题而“获得”设计模式,以掌握设计模式的本质、揭示设计模式之间的内在联系,以期解决学习设计模式的知易行难困境。
(请收藏。最后编辑时间:2021.2.18)
知乎目录
三门语言的编程环境 -Pelles c、DrRacket和BlueJ
本书讨论面向对象(的软件)设计(Object Orientation Design、OOD),因而需要回答:什么是面向对象或对象抽象,软件设计——不论是命令式语言C、函数式语言Scheme或面向对象语言Java——有什么(共同的)设计理念,OOD又有些什么侧重点(如对象创建、某些设计模式),等等。因此作为本书的开篇,本章说明读者在学习OOD和本书时应该具备的基础,主要包括如下方面。
0.1编程语言的掌握
0.2 PLP详解
0.3 设计原则
0.4 关于本书的若干说明
软件设计的全部,某种程度上,在于应对可变的需求。针对不确定的需求、或者说针对“某种”问题而编程是软件设计的基本研究内容。而OCP的简单推论——“针对接口编程”或抽象依赖原则即是软件设计的基础。本章围绕回调机制,阐述抽象依赖原则的应用。主要包括如下方面。
1.1 回调机制 1.1回调机制(知乎)
1.2 框架设计者 @【实验2:框架设计者 IoC】
1.3 通知机制
1.4 OOD领域的乱象
在软件开发中,如何应对用户频繁更改的需求是一个永恒的话题。行为参数化的意义或理论基础,就在于函数级别遵循OCP。行为参数化的要点是,当函数中存在可变部分(需求导致的各种变化)时,可以将变化的部分抽取出来,使之变成函数的参数——行为参数,而描述行为参数的最佳术语或许是高阶函数。本章介绍行为参数化相关的议题。
2.1 可变的需求被参数化 实验2.行为参数化
2.2 模板方法模式(5.10)
2.3 命令模式(5.2)
2.4 函数式编程风格
2.5 Java8函数接口简介
在面向对象技术中,对象的创建是一个基础性议题。既要有便捷的创建方式,也要有应对各种复杂情况的对象创建技巧。按照针对接口编程/抽象依赖原则,假定Demo需要依赖抽象类型IMan(后面简写为Demo→IMan),首先需要解决的问题是如何使得Demo依赖抽象类型IMan成为可能。换言之,抽象依赖原则的使能问题是面向对象技术必须解决的基础性问题。
本章介绍对象创建相关的议题。
3.1 工具类God
3.2依赖注入容器
3.3工厂模式
3.4 零例、单例和对象池
多重策略包含的多个策略,在模板方法模式中是彼此独立的,而在桥接模式是嵌套的。(这一章似乎应该并入第二章,但是会不会使得第二章太长?考虑ing....)
4.2 桥接模式
离散数学中有一个定义:S为非空集合,如果在S上定义的二元运算@(可以推广到n元运算,对于Java引用类型通常为一元运算),对于任意a,b∈S,有a*b∈S,则运算@具有封闭性/Closure。例如对于正整数,+操作是封闭的,而-操作不具有封闭性,因为1-2不是正整数。Closure在第二章中译为闭包,本章称之为封闭性,对应的运算称为封闭性运算或封闭性操作[1]。
封闭性操作拥有强大的组合能力,因为运算的结果可以被该操作符再次运算。Java数据类型中很多操作具有封闭性,如Java基本类型的运算基本上都是封闭的,使得从简单的表达式能够组合出复杂的表达式。本章主要讨论Java引用类型的封闭性操作,主要包括如下方面。
5.1 自引用模型
5.2 装饰模式 5.5 装饰模式(4.4)
5.3 数据结构型模式
5.4 封闭型方法
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 后序表达式
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字真经
如何学习设计模式
学习难度系数排名
乒乓球问题