设计模式

适配器模式定义


将两个不兼容的类纠合在一起使用,属于结构型模式,需要有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();
}

下面是新的AppleOrg,除了实现接口这一区别,和上面的没有什么差别.

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方法。

原文地址:https://www.cnblogs.com/baininghan/p/3876257.html