定义:Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 角色设定:
Helen,初次接触设计模式的美女程序员(没有BF)。
AndyTao,高手,战斗力达到N级,对设计模式有相当程度的了解。 问题的提出:
Helen埋首在公司自己的小空间里写着代码,(旁白:她虽然是个美女,但是写代码的水平还是不错的。)有点问题正在埋头苦想,这时,AndyTao从旁边冒出来,“嗨,美女,到点了,一起吃饭吧?”“不行,我正烦着呢!”Helen皱着眉头说。“哇,谁,谁欺负咱们Helen???”“切,谁敢欺负我啊。”“那怎么了?”AndyTao一副义愤填膺的样子(这小子,司马昭之心)。
“没有啦,我这里程序不好处理。”“噢,我看看!”AndyTao不知什么时候已经在Helen的身后了。
屏幕上一段代码:
public class DrawCircle {
public void DrawCircle() {
……
}
public void insert(String msg){
System.out.println("DrawCircle insert():"+msg);
}
……
}
public class DrawAngle {
public void DrawAngle() {
……
}
public void insert(String msg){
System.out.println("DrawAngle insert():"+msg);
}
……
}
“我现在要在DrawCircle中调用DrawAngle的方法,可是类的已经分发出去了,不能修改,我该怎么办?”
看着美女皱眉头的样子,AndyTao一阵心痛,“这样啊,我给你提示,再写个Adapter类吧。”“什么是Adapter?”
“呵呵,在实际编码过程中,由于某种需要,我们经常要将两个毫无关系的类交互。于是我们需要进行某种修正,修改各个类的接口,这通常不符合编码要求,而且,如果没有源代码,我们又该怎么办?于是,我们就要用到Adapter了,也就是适配器的意思。象你上面的程序,我们不能修改类接口,于是,我们再写一个Adapter类。” public class DrawAdapter extends DrawCircle { private DrawAngle drawangle;
public DrawAdapter(DrawAngle angle)
{
this.drawangle=angle;
}
public void insert(String msg) {
drawangle.insert(str);
}
……
} “在上面代码中,DrawAngle属于Adaptee,是被适配者。DrawAdapter是Adapter,将Adaptee(被适配者DrawAngle)和Target(目标DrawCircle)进行适配。实际上这是将组合方法(composition)和继承(inheritance)方法综合运用的一个例子。这样,你就无需对原来的类修改,甚至无需要知道其内部结构和源代码。” “上面我们说的是对象适配器(Object Adapter),它允许client和Adaptee完全无关,只有适配器知道它们两者的存在。另外,还有一种是类适配器(Class Adapter),它使用多重继承来实现。象对象适配器(Object Adapter)中,就是上个例子,DrawAdapter继承了DrawCircle,但是,DrawAdapter同样可以继承DrawAngle。由于Java不支持多重继承,这就是说,我们的某个类必须定义为接口(interface)。我们可以把DrawAngle定义为接口IDrawAngle,这样代码如下。”
public interface IDrawAngle
{
public void insert(String msg);
……
}
public class DrawAngle implements IDrawAngle
{
public void DrawAngle() {
……
}
public void insert(String msg)
{
System.out.println("DrawAngle insert():"+msg);
}
……
}
public class DrawAdapter extends DrawCircle implements IDrawAngle
{
private DrawAngle drawangle;
public DrawAdapter(DrawAngle angle)
{
this.drawangle=angle;
}
public void insert(String msg)
{
drawangle.insert(str);
}
……
}
“看到了么,这样我们就实现了类适配器(Adapter)模式。不过,类适配器(Adapter)有一个问题,如果我们的Target和Adaptee有一个相同名字的方法,Adapter不能保证这两个方法具有相同的含义或者行为,这是非常危险的。所以要注意这种情况!”
“哦,我知道了,Adapter模式的用处就在于使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。从而解决我现在的问题。”
“美女不笨嘛。这顿你请,以后我请,嘿嘿……”
“想追我?这顿我请,以后嘛,呵呵,再说吧。谢谢,走吧。”“OK!” 欲知后事如何,请待下回。^_^
作者:yakuu 来源: yakuu 的 Blog http://www.csai.cn