如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间——很短的一点儿时间。 —— 王尔德
前言
今天学习的设计模式为适配器模式和外观模式,至于为什么两个一起学,因为书上是这样的。至于为什么书上是这样的,就一起来回顾吧。
正文
适配器模式(adapter)
**适配器模式(Adapter)**在 Android 中真是不能再常见了,因为我们所用到的很多控件都需要编写适配器给控件提供数据源,例如: ListView
、RecyclerView
、spinner
等待呢个,至于为什么这些控件要使用适配器模式却一直不求甚解,今天就来好好思考一下。
还记得第一节课的Duck
吗,我们可以通过适配器模式将它变成Turkey
!
Duck
1 | public interface Duck { |
Turkey
1 | public interface Turkey { |
可以看到它们都有相似的功能,但是用起来却并不一致,我们使用适配器来修改。
1 | public class TurkeyAdapter implements Turkey { |
这样一个非常简单的适配器就完成了,我们可以TurkeyAdapter
的crow
以此来调用duck
的quack
方法来达到叫喊的功能且不需要修改它们。当然,实际代码中可能更为复杂,
适配器也很贴近生活,我们在生活中经常用到适配器,电源适配器使我们不同电压的电器都能在统一电压的插口中使用。而编程中适配器的作用也是如此。它可以让不同的数据转换后适应现有的系统。而 Android 中也是这样,通过适配器这些控件只需要关心自己逻辑上的各种处理,将具体的显示视图和数据交给适配器来进行转换成控件可使用的。
上面介绍的这一种是“”对象“”适配器,除此之外还有一种“类”适配器,不过需要多重继承才能实现它,这在 java 中是不可能的。它让适配器类同时继承了duck
和Turkey
以此来实现适配器的功能。“对象”适配器比“类”适配器更加有弹性,只不过没有”类”适配器的轻便。
那么之前学习到的装饰者模式和适配器模式它们有什么区别?,装饰主要的工作是扩展被包装的对象的行为或者责任。而适配器模式更主要的是将转换对象的行为为现在可用的。
适配器模式将一个类的接口,转换成客户棋王的另一个接口。适配器让原本接口不兼容的类可以合作无间。
外观模式
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用
外观模式的功能也是转换,不过它并不是为了修改而是为了简化,使功能更加“聪明”。例如我们在使用HttpUrlConnection
的时候要按步骤来执行非常多的方法,而为此是封装它就是为了简化那些固定流程,留给使用者更加简单易懂方便的操作。请求数据 👉 接受数据即可。
TODO
要点
- 设计原则 : 减少对象之间的交互,只留下最基础的。
- 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。
- 当需要简化并统一一个很大的接口或者一群复杂的接口时候,使用外观。
- 适配器改变接口以符合客户的期望
- 外观将客户从一个复杂的子系统中解耦。
- 实现一个适配可能需要一番功夫,也可能不费工夫,视目标接口的大小与复杂度而定。
- 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。
- 适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承。
- 你可以为一个子系统实现一个以上的外观。
- 适配将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口。