适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:
我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;
所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。
但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,
因此也极可能引入新的问题等等。如何最大限度的降低修改面呢?
Adapter模式就是针对这种类似需求而提出来的。
Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。
这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响
根据调用方式的不同,Adapter模式有2种实现方法:
1. 通过继承实现Adapter
2. 通过委让实现Adapter
通过继承实现Adapter的例子:
旧模块:
1 public class OldClass {
2 public void sayHello(){
3 System.out.println("I'm oldeClass!");
4 }
5 }
2 public void sayHello(){
3 System.out.println("I'm oldeClass!");
4 }
5 }
接口:
1 public interface AdapterDemo {
2 public void sayHello();
3 public void sayBye();
4 }
2 public void sayHello();
3 public void sayBye();
4 }
适配器:
1 public class NewClass extends OldClass implements AdapterDemo{
2 @Override
3 public void sayBye() {
4 System.out.println("See you later!");
5 }
6 }
2 @Override
3 public void sayBye() {
4 System.out.println("See you later!");
5 }
6 }
测试:
1 public class AdapterTest {
2 public static void main(String[] args) {
3 NewClass nc = new NewClass();
4 nc.sayHello();
5 nc.sayBye();
6 }
7 }
2 public static void main(String[] args) {
3 NewClass nc = new NewClass();
4 nc.sayHello();
5 nc.sayBye();
6 }
7 }
通过委让实现Adapter 的例子:
上记接口与旧模块不变,将新模块的代码进行改造
1 public class NewClass implements AdapterDemo{
2 // 旧模块的对象
3 OldClass oldModel;
4
5 public NewClass(OldClass old){
6 oldModel = old;
7 }
8
9 @Override
10 public void sayHello() {
11 oldModel.sayHello();
12
13 }
14 @Override
15 public void sayBye() {
16 System.out.println("See you later!");
17 }
18 }
2 // 旧模块的对象
3 OldClass oldModel;
4
5 public NewClass(OldClass old){
6 oldModel = old;
7 }
8
9 @Override
10 public void sayHello() {
11 oldModel.sayHello();
12
13 }
14 @Override
15 public void sayBye() {
16 System.out.println("See you later!");
17 }
18 }
测试:
1 public class AdapterTest {
2 public static void main(String[] args) {
3 OldClass old = new OldClass();
4 NewClass nc = new NewClass(old);
5 nc.sayHello();
6 nc.sayBye();
7 }
8 }
2 public static void main(String[] args) {
3 OldClass old = new OldClass();
4 NewClass nc = new NewClass(old);
5 nc.sayHello();
6 nc.sayBye();
7 }
8 }