(导读 III)
作为面向对象基础设计原则的忠实体现,设计模式帮助我们在学习过程中不断强化以下五项原则性设计:
1. 单一职责原则 (SRP) —— 一个类应该有且仅有一个引起变化的因素;
2. 开放封闭原则 (OCP) —— 对扩展开放,对修改封闭;
3. Liskov 替换原则 (LSP) —— 子类可以替换为它的基类;
4. 依赖倒置原则 (DIP) —— 高层模型不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象;
5. 接口隔离原则 (ISP) —— 一个类对另外一个类的依赖建立在最小的接口上;
(导读 VII) 行为型模式关注与运行过程中算法的提供和通信关系的梳理;
(P18)
如果代码将被反复重用,只要进度允许,尽量用泛型:
1. 省去 Cast 过来 Cast 过去,提高了效率;
2. 抽象给代码带来更多适应性;
3. 减少接口和参数的歧义;
(P80) 工厂方法地的意图非常明确,它把类的实例化过程延迟到子类,将 new() 的工作交给工厂完成;
(P184)
适配器主要有三个作用:
1. 完成旧接口到新接口的转换;
2. 将“既有系统”进行封装,逻辑上客户程序不知道“既有系统”的存在,将变化隔离在 Adapter 部分;
3. 如果客户程序需要迁移,仅需要在 Adapter 部分做修改;
(P187) 如果在一开始学习的时候就有人提示一下多好;
(P260) “用面向对象思想设计的应用常常会面临对象实例过多的问题。”
(P276) 外观模式是屏蔽复杂性的,很多时候代理模式的控制本身也就是对各种复杂性的屏蔽,只不过外观处理的是一个逻辑上的“子系统”,而且其封装后的结果并没有具体抽象接口的要求,但在代理模式中客户程序需要的接口明确化了;
(P415) 同样是排序算法,考虑到 CPU 和内存容量的不同, 在手机和在PC计算机上可能采用不同的排序算法;
(P418)
排序算法选择:
1. 实现简单 —— 冒泡排序策略;
2. 比较快速地对小数据量进行处理 —— 快速排序策略;
3. 大数量 —— 外排序;
(P445) ORM —— Object —— Relation Mapping ;
(P457)
—— DataSet的优势:——
1. 使用 offline 的内存数据库;
2. 可以装载多个 DataTable;
3. 与 XML 的天然集成;
4. 有比较完善的内存数据筛选、查询机制;
5. 同时可以维护多个数据对象间的关联关系;
6. 尤其对于两层的数据应用而言,提供了完善的数据使用周期支持;
—— DataSet的劣势 ——
1. 数据的业务语义不甚清晰,客户程序必须了解字段的组成才能提取字段项;
2. 传输中有很多“冗余”的信息在传递;
3. 弱类型的数据结构在开发过程中不如强类型的数据实体使用方便;
4. 容量有限制;
5. 并非标准的数据结构,在 WS-* 调用中考虑到互操作性要求,需要必要的转换;
(P462) GOF 给我们最大的启示就是把紧密引用在一起的对象通过抽象或增加第三个对象的办法拆解得更加松散;
(P482) 模式的使用都是针对某些特定变化而引入的;
(P495)
MVC 模式设计是 M 相对 V 稳定的基础上考虑的,但如果 M 本身相对 V 变化更快, MVC 模式的应用效果就会打折扣。它的主要优势在于同一 M 可以支持很多不同的 V ,而且会通过观察者模式或 C 协助 V 完成信息的更新,但它也同样存在劣势:
1. 对于 V 相对单一或简单的情况而言,MVC 本身引入了更多的复杂性;
2. 更新的成本相对增加了,原本可以在一个方法中完成的更新要被分拆为 M/V/C 三类对象的协作;
(P499) “管道 - 过滤器”(Pipeline - Filters) 模式是一种通过组织一系列连续过滤条件完成既定处理的模式;
(P563) “高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。”
(P570) .NET 3.0 之后对于远程调用技术集中到 WCF 框架下;
(P574) WCF 其实在用面向对象化的方式解决面向服务的开发问题;
(P628) 在领域驱动设计中 (DDD : Domain Driven Design) 中,实现业务逻辑层主要有 Transcation Script、Domain Module 和 Table Module 三种模式;
(P644) 不兼容接口间适配器 (Adapter) 是个不错的途经;