适配器模式定义
将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adapee(被适配者)和Adaptor(适配者).
为何使用
我们经常要碰到,将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办? 同时修改接口也很会破坏整个架构,这也是不可取的.
于是我们想到使用Adapter,在两种接口之间创建一个混合接口(混血儿).
就像笔记本的电源适配器一样.
如何使用?
实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance).
假设我们有两棵树,分别是苹果树和橘子树.
public class Apple {
public void insertApple() {
System.out.println("insert a Apple");
}
}
public class Org {
public void insert() {
System.out.println("insert a Org");
}
}
现在有一个应用,我们既想得到苹果又想得到橘子.但是我们不知道 Apple 的源代码或者我们不想改动源代码那么我们可以使用Adapter来实现这个应用.
public class FruitAdapter extends Org {
private Apple apple;
public FruitAdapter (Apple apple){
this.apple = apple;
}
public void insert(){
apple.insertApple();
}
}
在上面代码中,Apple属于Adaptee,是被适配者.FruitAdapter是Adapter适配器,将Adaptee(被适配者Apple)和Target(适配者Org)进行适配.实际上这是将组合(composition)方法和继承(inheritance)方法综合使用.
FruitAdapter首先继承Org,然后使用 new 的组合生成对象方式,生成Apple的对象Apple,再重载父类insertOrg()方法。从这里,你也了解使用 new 生成对象和使用 extends 继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.
如果你有些Java使用的经验,已经发现,这种模式经常使用。
进一步使用
上面的FruitAdapter是继承了Org,如果我们需要两边继承,即继承Org 又继承Apple,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface).
public interface IApple {
public void insertApple();
}
public interface IOrg {
public void insert();
}
下面是新的Apple和Org,除了实现接口这一区别,和上面的没有什么差别.
public class Apple implements IApple {
public void insertApple() {
System.out.println("insert a Apple");
}
}
public class Org implements IOrg {
public void insert() {
System.out.println("insert a Org");
}
}
下面是新的FruitAdapter,叫做two-way adapter:
public class FruitAdapter implements IApple, IOrg{
private Apple apple;
private Org org;
public FruitAdapter (Apple apple){
this.apple = apple;
}
public FruitAdapter (Org org){
this.org = org;
}
public void insert(){
apple.insertApple();
}
}
还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。