Bruce Eckel

读完需要

10

分钟

速读仅需 1 分钟

布鲁斯 • 埃克尔(Bruce Eckel),C++ 标准委员会的创始成员之一,知名技术顾问,专注于编程语言和软件系统设计方面的研究,常活跃于世界各大顶级技术研讨会。
他自 1986 年以来,累计出版 Thinking in C++、Thinking in Java、On Java 等十余部经典计算机著作,曾多次荣获 Jolt 最佳图书奖(被誉为“软件业界的奥斯卡”),其代表作 Thinking in Java 被译为中文、日文、俄文、意大利文、波兰文、韩文等十几种语言,在世界范围内产生了广泛影响。

Bruce Eckel:再聊设计模式(篇一)设计模式分类

Bruce Eckel:再聊设计模式(篇二)封装实现

Bruce Eckel:再聊设计模式(篇三)工厂模式

Bruce Eckel:再聊设计模式(篇四)函数对象模式

8

改变接口

有时你要解决的问题可能就像“我没有想要的接口”这么简单。有两种设计模式可以解决这个问题:适配器模式(Adapter)接收一种类型为参数,并生成面向另一种类型的接口;外观模式(Facade)可以创建一个面向一组类的接口,这只是提供了一种更为简便的方式,来处理一个库或一批资源。

8.1

适配器模式

当你有了 A,而且想要 B 的时候,适配器模式便可以解决你的问题。这里唯一的需求就是生成 B,有多种方法可以完成该适配工作:

// patterns/adapt/Adapter.java
// 多种适配器模式
// {java patterns.adapt.Adapter}
package patterns.adapt;class WhatIHave {public void g() {}public void h() {}
}interface WhatIWant {void f();
}class ProxyAdapter implements WhatIWant {WhatIHave whatIHave;ProxyAdapter(WhatIHave wih) {whatIHave = wih;}@Override public void f() {// 用WhatIHave中的方法实现行为:whatIHave.g();whatIHave.h();}
}class WhatIUse {public void op(WhatIWant wiw) {wiw.f();}
}// 方法2:构造传入op()中使用的适配器
class WhatIUse2 extends WhatIUse {public void op(WhatIHave wih) {new ProxyAdapter(wih).f();}
}// 方法3:在WhatIHave内部构造适配器
class WhatIHave2 extends WhatIHave
implements WhatIWant {@Override public void f() {g();h();}
}// 方法4:使用内部类
class WhatIHave3 extends WhatIHave {private class InnerAdapter implements WhatIWant{@Override public void f() {g();h();}}public WhatIWant whatIWant() {return new InnerAdapter();}
}public class Adapter {public static void main(String[] args) {WhatIUse whatIUse = new WhatIUse();WhatIHave whatIHave = new WhatIHave();WhatIWant adapt= new ProxyAdapter(whatIHave);whatIUse.op(adapt);// 方法2:WhatIUse2 whatIUse2 = new WhatIUse2();whatIUse2.op(whatIHave);// 方法3:WhatIHave2 whatIHave2 = new WhatIHave2();whatIUse.op(whatIHave2);// 方法4:WhatIHave3 whatIHave3 = new WhatIHave3();whatIUse.op(whatIHave3.whatIWant());}
}

在 ProxyAdapter 的应用上,我对术语“代理”的使用没有那么严格。《设计模式》一书的作者主张代理必须具有和其代理的对象完全相同的接口。将代理和适配器这两个词合并为代理适配器(ProxyAdapter)来使用也许更合理。

8.2

外观模式

这是我在将需求转化为对象设计的开始阶段所遵循的原则:

如果有一段逻辑很丑陋,那么就把它藏到对象里。

这基本上就是外观模式所完成的任务。如果你有一堆相当杂乱的类和交互逻辑,并且不需要让调用方程序员看到,就可以将这些藏到一个接口后面,以一种更易懂的形式(只)暴露出外部需要知道的信息。外观模式通常被实现为单例抽象工厂。可以使用包含静态工厂方法的类来实现这个效果:

// patterns/Facade.javaclass A { A(int x) {} }
class B { B(long x) {} }
class C { C(double x) {} }// 其他不需要由外观暴露出去的类都放到这里public class Facade {static A makeA(int x) { return new A(x); }static B makeB(long x) { return new B(x); }static C makeC(double x) { return new C(x); }public static void main(String[] args) {// 调用方程序员通过调用静态方法得到对象:A a = Facade.makeA(1);B b = Facade.makeB(1);C c = Facade.makeC(1.0);}
}

《设计模式》中给出的示例并不是真正的外观模式,只是一个用到了其他类的类而已。

8.3

可作为外观模式变体的 Java 包

对我来说,外观模式会给人一种相当“面向过程”(而非面向对象)的感觉:我们只是在调用一些生成对象的函数而已。而这实际上和抽象工厂又有多大区别呢?外观模式的重点在于将一组类(以及它们之间的交互)形成的库部分隐藏起来,不让调用方程序员看到,使得这一组类对外暴露出的接口更好用、更易懂。而这正是 Java 的包特性所实现的功能。在库以外只能创建和使用 public 的类,而所有非 public 的类都只能在包范围内访问。这就好像外观模式是 Java 的内建特性。公平地讲,《设计模式》面向的主要是使用 C++的群体。虽然 C++有命名空间来防止全局冲突和类名冲突,但这并不能提供由 Java 中的非 public 类带来的类隐藏机制。大部分时候,Java 的包似乎就可以解决外观模式所要解决的问题了。

9

解释器模式:运行时的灵活性

在一些应用程序中,用户需要在运行时拥有更高的灵活性,例如创建用来描述系统所需行为的脚本。解释器设计模式可以用来创建语言解释器,并将其嵌入这样的程序中。

在构建应用程序的过程中,开发自定义语言以及为其构建解释器是一件费时费力的事。最好的方案是复用代码:嵌入一个已构建好并且调试过的解释器。Python 语言可以免费地嵌入到营利性质的应用程序中,而无须任何许可协议、版税或其他产权负担。另外,Python 还有一个称为 Jython 的版本(已经过时了,但仍然能用),它是彻底的 Java 字节码,因此将它加入 Java 程序是相对比较简单的。Python 是一种脚本语言,易于学习,编写和阅读的逻辑性很强,支持函数和对象,拥有大量可用的库,并且几乎可以在所有的平台上运行。你可以通过 Python 网站进一步学习。


本书特色

  • 查漏宝典:涵盖Java关键特性的设计原理和应用方法

  • 避坑指南:以产业实践的得失为鉴,指明Java开发者不可不知的设计陷阱

  • 经典普适:值得不同层次的Java开发者反复研读

  • 专家领读:4位一线业务专家、知名作译者帮你拆解书中难点,总结Java开发精要

值得一提的是,为了帮助新手加深理解,出版方邀请了4位从业10年以上知名作译者DDD 专家张逸、服务端专家梁桂钊、软件系统架构专家王前明、译者陈德伟)为本书录制【精讲视频】和【导读指南】,该视频已在B站和图灵社区发布,感兴趣的朋友可以去看看。

往期推荐

Bruce Eckel:再聊设计模式(篇一)

Bruce Eckel:再聊设计模式(篇二)封装实现

Bruce Eckel:再聊设计模式(篇三)工厂模式

Bruce Eckel:再聊设计模式(篇四)函数对象模式

Bruce Eckel - 详解函数式编程(卷一)

Bruce Eckel - 详解函数式编程(卷二)

Bruce Eckel - 详解函数式编程(卷三)

如何在 SpringBoot 项目中控制 RocketMQ消费线程数量

同事多线程使用不当导致OOM,被我怒怼了

怎样才能持续输出技术原创文章?

后Kubernetes时代的微服务

我,程序员,马上35岁...

史海峰:在时代节点上顺势而为是一种幸运

知明:技术 Leader 的思考法

一文理解分布式开发中的服务治理

聊聊 8 种架构模式

Google工程师是怎么写设计文档的?

聊聊技术人员如何做好团队管理

为什么大数据平台要回归 SQL

如葑:阿里云原生网关Envoy Gateway实践

如何用研发效能搞垮一个团队

他教全世界程序员怎么写好代码,答案写在这里!

研发效能提升的实践框架、模式与反模式

聊聊大中型公司都热衷于造轮子的故事

被滥用的“架构师”!

构建健壮的分布式系统

阿里在云原生架构下的微服务选型和演进

Bruce Eckel:再聊设计模式(篇五)改变接口相关推荐

  1. Bruce Eckel:再聊设计模式(篇一)

    Bruce Eckel 读完需要 4 分钟 速读仅需 2 分钟 布鲁斯 • 埃克尔(Bruce Eckel),C++ 标准委员会的创始成员之一,知名技术顾问,专注于编程语言和软件系统设计方面的研究,常 ...

  2. Bruce Eckel:我最喜欢Python,Kotlin或将取代Java(附演讲全文+PPT)

    导读:Java很难再做出更多的改变了,那么它会被替代吗?它的替代者是谁? Bruce Eckel为什么最喜欢Python,Python究竟好在哪? Kotlin是怎样为程序员提高效率的? 大龄程序员应 ...

  3. Java:进化的尽头 by Bruce Eckel 以及Thinking in Java 5th edition 《On Java 8》

    在读Java编程思想之前,上网搜了一下Bruce Eckel的信息,发现了这篇文章和Java编程思想(4th edition)的课后题,仅做参考吧,CSDN上可下载.随后跟踪到了Bruce Eckel ...

  4. 编程不适合12小时工作制,“我有灵感才工作” | 专访《Java编程思想》作者Bruce Eckel...

    整理 | 蔡芳芳 采访 | 王一鹏.蔡芳芳 本文转载自公众号infoQ 编者按: 如果你是一个 Java 开发者,那你想必读过或至少听过<Java 编程思想>(Thinking in Ja ...

  5. iOS开发~细聊设计模式

    目录 一.概述 二.框架模式,框架,设计模式 1.框架模式 (1)MVC (2)MVVM (3)MVP 2.设计模式 (1)原型模式(Prototype pattern) (2)简单工厂模式.工厂模式 ...

  6. 十年后2023年再读这篇文章,看看我将会怎么样?

    看到一篇文章不错[清华差生10年奋斗经历] ,写给将要工作的自己,十年后2023年再读这篇文章,看看我将会怎么样? 在2012年收关时刻,看到如此激励的文章,实在是我的幸运.文章讲述了所谓清华差生的奋 ...

  7. 十年后2023年再读这篇文章,看看我将会怎么样

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 看到一篇 ...

  8. 豆瓣评分 9.3 的 Java 巨著 | Bruce Eckel 重讲 Java 的编程思想

    硅谷创业之父 Paul Graham 曾在<黑客与画家>中写道:"判断一种语言是否流行的条件是,一种免费的实现,一本相关的书籍,以及语言所依附的计算机系统." 当然,J ...

  9. 小菜学习设计模式(五)—控制反转(Ioc)

    写在前面 设计模式目录: 小菜学习设计模式(一)-模板方法(Template)模式 小菜学习设计模式(二)-单例(Singleton)模式 小菜学习设计模式(三)-工厂方法(Factory Metho ...

最新文章

  1. springboot整合mybatis记录
  2. 继BERT之后,这个新模型再一次在11项NLP基准上打破纪录
  3. Linux 下gedit编辑器的使用
  4. 形态学操作——击中击不中变换
  5. 9. 回文数 golang 整数处理
  6. python中Numpy中的替代值
  7. linq 动态拼接where条件 类似 T_SQL And Or
  8. 使用token实现在有效期内APP自动登录功能
  9. python没有requests模块_python没有名为“requests”的模块
  10. AjaxControlToolKit之AutoCompleteExtender用法
  11. [渝粤教育] 广东-国家-开放大学 21秋期末考试马克思主义基本原理概论(A)10882k1 (2)
  12. NOI 2021 游记
  13. matlab导入vgg16,简单导入VGG16
  14. 计算机课评课意见,信息技术应用 用计算机画函数图象第一课时评课稿
  15. Shopee平台有哪些电商大促活动?大促活动如何报名?
  16. 计算机可以怎样做游戏,如何制做游戏 怎么制做游戏
  17. python输入月份判断天数用函数的方法,python 月份天数
  18. 数据加工(一)-------数据抽取
  19. 炼数成金-Spark大数据平台
  20. tfidf关键词提取_基于深度学习的个性化商品评论标签提取

热门文章

  1. 前端工程化项目的思考
  2. 手把手教你在阿里云服务器部署一个属于自己的项目(一)新用户领取阿里云服务器
  3. mysql操作json优点和缺点_MYSQL 5.7中的本机JSON支持:MYSQL中JSON数据类型的优缺点是什么?...
  4. 模型优化-提高准确率
  5. 网络基础(二)之TCP/UDP协议
  6. ISO9001认证大致流程
  7. 【疯壳·ARM功能手机开发教程1】开发板上电教程
  8. 两种高效的并发模式:半同步/半异步模式、领导者/追随者模式
  9. VsCode 更新后merge代码不显示accept incoming
  10. 数据库查询语句中的排序