ThoughtWorks——结对编程

传言:在国内,ThoughtWorks被称为“最难面试的IT公司”。貌似在国外也被评为全球最难面试的IT司。

面试一般都是纸上谈兵,尤其是设计模式这种需要“付诸实践”的面试题。面试前先给面试者布置“家庭作业”,然后Thoughtworks会派工程师和面试者进行结对编程,让面试者通过测试驱动和代码重构表现他/她的编程规范、设计和重构的能力。这个时候可以很容易看到面试者对设计模式的掌握和运用情况。

设计模式,一般在面试的过程中都可以可无的提及到。但是这个就真的是看面试官的心情了。问简单了吧,单例模式,工厂模式,然后再深一点,单利模式是如何保证单例的实现的,感觉有点吹毛求疵的感觉。

回调函数和观察者模式的区别?

作为一个"资深程序员",看到这个题目你一定在飞速的思考着这个问题吧,这个题目其实不是在重点的考验你的设计模式的能力,而是考验一个程序员的及时反应能力。

观察者模式

网上很容易查到观察者模式的定义:

观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

Android中大量的使用了观察者模式。你可能已经用过ListView的adapter.notifyDataSetChanged来触发ListView的列表界面进行更新。notifyDataSetChanged的内部实现就是基于观察者模式。

跟进这段代码你会发现:BaseAdapter中的DataSetObserver(观察者)实现

Observer接口,DataSetObservable(被观察者)继承Observable类。

标准的观察者模式的写法应该照下面的UML图:

有几个概念(抽象主题(Subject)、具体主题(ConcreteSubject)、抽象观察者(Observer)和具体观察者(ConcreteObserver)),好在Java帮我实现了相关的代码,可以通过Observable类和Observer接口实现了观察者模式。Observer对象是观察者,Observable对象是被观察者。

还有EventBus, RxJava等常见的开源库也是居于观察者模式设计的,只是它们实现的方式各有不同。

回调函数

那回调函数和这又有什么关系呢?看看这段再熟悉不过的代码片段:

View的Listener监听会通过setOnClickListener给View传递一个Listener对象,当相关的事件发生时是触发onClick(回调onClick)。这其实也是一种观察者模式,OnClickListener是观察者,View是被观察者,当View收到Click事件是会通知观察者执行onClick()。

关于设计模式的反思

模式的外在形式其实是“套路”,这些套路来源于现实中生产实践的总结,但要清楚认识到不是所有“套路”都会合适你的。

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式的初衷是用经过检验的“套路”来提高代码的生产效率,人们也容易理解约定成俗的“套路”。从面向对象设计的角度来看,其实就是要做到高内聚低耦合。

所以,在考虑使用什么样的模式或模式组合时,我们不妨先冷静下来回忆一下面向对象设计的SOLID原则,我们要遵循一定的原则,而不是为了模式而模式。

面向对象设计的SOLID原则:

  • S 单一功能原则:对象应该仅具有一种单一功能。
  • O 开闭原则:软件体应该是对于扩展开放的,但是对于修改封闭的。
  • L 里氏替换原则:程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的。
  • I 接口隔离原则:多个特定客户端接口要好于一个宽泛用途的接口。
  • D 依赖反转原则:依赖于抽象而不是一个实例,依赖注入是该原则的一种实现方式。

所以综上所述:(答案不是标准,只是一种思路)

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。观察者模式完美的将观察者和被观察的对象分离开,一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 回调函数其实也算是一种观察者模式的实现方式,回调函数实现的观察者和被观察者往往是一对一的依赖关系。 所以最明显的区别是观察者模式是一种设计思路,而回调函数式一种具体的实现方式;另一明显区别是一对多还是多对多的依赖关系方面。

Android较常用到的设计模式? 标准答案: 适配器模式:GridView、ListView的Adapter; 建造者模式:AlertDialog.Builder; 观察者模式:ListView的adapter.notifyDataSetChanged; 责任链模式:View的事件分发;

有兴趣关注下公众号 持续更新


Android历练记 是一个关于Android最新技术探讨,包含安全,架构,Android技术开发,ui绘制,源码解析等领域,如果你有兴趣,我们可以一起讨论学习,关注微信公众号 Android历练记

本文分享自微信公众号 - Android历练记(gh_db8538619cdd)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励