思考题

想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262

  • println、log 日志接口、JDBC 接口
  • 突然让想感觉想不出来,各种 API 都用得挺顺的,没有太麻烦的使用

外观模式

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。 P264

特点
  • 提供简化的接口的同时,依然将系统完整的功能暴露出来 P260
  • 将客户从组件的子系统中解耦 P260
  • 意图是提供子系统的一个简化接口 P260
区别 P270
  • 适配器模式:将一个对象包装起来以改变其接口
  • 装饰器模式:将一个对象包装起来以增加新的行为和责任
  • 外观模式:将一群对象“包装”起来以简化其接口

设计原则

最少知识原则:只和你的密友谈话。即减少对象之间的交互,减少类的耦合。 P265

优点
  • 减少软件的维护成本 P267
缺点
  • 导致制造更多的“包装”类 P267
  • 导致增加复杂度和开发时间 P267
  • 降低运行时的性能 P267
遵循最少知识原则的方针

对于任何对象,在该对象的方法内,我们只应该调用属于以下范围的方法: P266

  • 该对象本身
  • 被当作方法的参数而传递进来的对象
  • 此方法所创建或实例化的任何对象
  • 对象的任何组件

由前三条可知:不要调用其他方法返回结果的方法

思考题

这些类有没有违反最少知识原则?请说明原因。 P268

public class House {
WeatherStation station; // 其他的方法和构造器 public float getTemp() {
return station.getThermometer().getTemperature();
}
// 违反了最少知识原则
// 调用了方法返回结果的方法
} public class Houst {
WeatherStation station; // 其他的方法和构造器 public float getTemp() {
Thermometer thermometer = station.getThermometer();
return getTempHelper(thermometer);
}
// 没有违反最少知识原则
// 只调用了对象的组件以及对象本身的方法 public float getTempHelper(Thermometer thermometer) {
return thermometer.getTemperature();
}
// 只调用了参数
}

所思所想

  • 大部分接口功能的封装应该都算使用了外观模式。比如说下单操作,对外只暴露了一个下单接口,但内部其实有大量的子组件调用(购物车接口、运费计算接口、优惠券接口、地址接口、下单中间件、物流接口等)。再比如一个简单println,内部就包含了并发控制、异常捕获、调用BufferedWriter对象进行输出控制等。

本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/head-first-design-patterns

最新文章

  1. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
  2. JAVA String.format 方法使用介绍
  3. C语言实现的OOP
  4. HTML5 appcache
  5. QuartusII 中使用Modelsim对子程序进行仿真
  6. 使用python向Redis批量导入数据
  7. DDD分层架构之仓储
  8. Android中的eventBus传值
  9. cxf整合spring中出现的错误
  10. 字符串相关的hash值(一)
  11. Idea 调试快捷键
  12. Codeforces.833B.The Bakery(线段树 DP)
  13. P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)
  14. git clone慢
  15. byobu copy
  16. poj 3255 Roadblocks 次短路(两次dijksta)
  17. Oracle 数据库实例
  18. 《简明Python教程》学习笔记
  19. android WebView中js的alert()失效
  20. case when then end 用法

热门文章

  1. Linux里的几种不同的压缩命令小记
  2. Ambari HDP集群搭建全攻略
  3. pytorch知识(torch.sum,以及维度问题)
  4. 【坑点集合】C++ STL 使用注意事项整理
  5. 学习笔记:Prufer 编码
  6. 【Codeforces 1097F】Alex and a TV Show(bitset & 莫比乌斯反演)
  7. 安卓实用工具箱v4.3几百种小功能
  8. Goldengate搭建
  9. GC agent的安装和卸载
  10. torch中squeeze与unsqueeze用法