如何建造一个城市
- 分工清晰明确 全局&细节—— 角色:老师 医生 程序员 …
- 恰当的抽象层级模块 ——管理: 老板 领导 下属 …
- 关注面切分 —— 全局性适用功能:每个人都要有身份证 社保卡
将系统的构造与使用分开
构造与使用分开的方法
- 分解main 将全部构造过程搬迁到 main
- 依赖注入 控制反转 DI容器 工厂解耦了构造细节
扩容
横贯式关注面 —— 关注面切分 将策略铺展到许多对象中 横贯孤立的模块化 横贯性问题
- 声明式事务
- 安全
- 缓存
- 恢复
- 部分持久化行为 行为的修改由 AOP 框架以无损方式在目标代码中进行
三种切面机制
Java代理
适用简单情形 在单独的类或者对象中包装方法调用
- 需要与接口协同工作:JDK 代理
- 不需要与接口协同工作:CGLIB
代理两大弱点
- 代码量
- 复杂度
创建整洁代码变难 也没有提供在系统范围内指定执行点的机制
纯 Java AOP 框架
配置文件 xml —— 通过描述性手段支持横贯式关注面的模型
AspectJ 的方面
通过方面来实现关注面切分功能 —— AspectJ
测试驱动系统架构
通过方面式的手段切分关注面的威力不可低估 这样可以将代码层面与架构关注面分离开 就有可能真正地用测试来驱动架构
最佳的系统架构由模块化的关注面领域组成 不同领域间用最不具有侵害性的方面或类方面工具整合起来
优化决策
模块化和关注面切分成就了分散化管理和决策
总结 避免侵害性架构 避免困扰领域逻辑 防止敏捷能力受到冲击 保证测试驱动及生产力不受干扰