Base Station

适配器模式与外观模式

"Head First学习笔记(五)"

字数统计: 1.2k阅读时长: 4 min
2017/03/08

如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间——很短的一点儿时间。 —— 王尔德

前言

今天学习的设计模式为适配器模式和外观模式,至于为什么两个一起学,因为书上是这样的。至于为什么书上是这样的,就一起来回顾吧。

正文

适配器模式(adapter)

**适配器模式(Adapter)**在 Android 中真是不能再常见了,因为我们所用到的很多控件都需要编写适配器给控件提供数据源,例如: ListViewRecyclerViewspinner等待呢个,至于为什么这些控件要使用适配器模式却一直不求甚解,今天就来好好思考一下。

还记得第一节课的Duck吗,我们可以通过适配器模式将它变成Turkey

Duck

1
2
3
4
5
public interface Duck {
void fly();

void quack();
}

Turkey

1
2
3
4
5
public interface Turkey {
void fly();

void crow();
}

可以看到它们都有相似的功能,但是用起来却并不一致,我们使用适配器来修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TurkeyAdapter implements Turkey {
Duck duck;

public TurkeyAdapter(Duck duck) {
this.duck = duck;
}

@Override
public void fly() {
duck.fly();
}

@Override
public void crow() {
duck.quack();
}
}

这样一个非常简单的适配器就完成了,我们可以TurkeyAdaptercrow以此来调用duckquack方法来达到叫喊的功能且不需要修改它们。当然,实际代码中可能更为复杂,

适配器也很贴近生活,我们在生活中经常用到适配器,电源适配器使我们不同电压的电器都能在统一电压的插口中使用。而编程中适配器的作用也是如此。它可以让不同的数据转换后适应现有的系统。而 Android 中也是这样,通过适配器这些控件只需要关心自己逻辑上的各种处理,将具体的显示视图和数据交给适配器来进行转换成控件可使用的。

上面介绍的这一种是“”对象“”适配器,除此之外还有一种“类”适配器,不过需要多重继承才能实现它,这在 java 中是不可能的。它让适配器类同时继承了duckTurkey以此来实现适配器的功能。“对象”适配器比“类”适配器更加有弹性,只不过没有”类”适配器的轻便。

那么之前学习到的装饰者模式和适配器模式它们有什么区别?,装饰主要的工作是扩展被包装的对象的行为或者责任。而适配器模式更主要的是将转换对象的行为为现在可用的。

适配器模式将一个类的接口,转换成客户棋王的另一个接口。适配器让原本接口不兼容的类可以合作无间。

外观模式

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

外观模式的功能也是转换,不过它并不是为了修改而是为了简化,使功能更加“聪明”。例如我们在使用HttpUrlConnection的时候要按步骤来执行非常多的方法,而为此是封装它就是为了简化那些固定流程,留给使用者更加简单易懂方便的操作。请求数据 👉 接受数据即可。

TODO

要点

  • 设计原则 : 减少对象之间的交互,只留下最基础的。
  • 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。
  • 当需要简化并统一一个很大的接口或者一群复杂的接口时候,使用外观。
  • 适配器改变接口以符合客户的期望
  • 外观将客户从一个复杂的子系统中解耦。
  • 实现一个适配可能需要一番功夫,也可能不费工夫,视目标接口的大小与复杂度而定。
  • 实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。
  • 适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承。
  • 你可以为一个子系统实现一个以上的外观。
  • 适配将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口。
CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 适配器模式(adapter)
    2. 2.2. 外观模式
    3. 2.3. 要点