三、分类
在《设计模式》一书中将适配器模式分为类适配器模式和对象适配器模式。区别仅在于适配器角色对于被适配角色的适配是通过继承完成的还是通过组合来完成的。由于在java 中不支持多重继承,而且继承有破坏封装之嫌,众多的书中(包括《设计模式》)都提倡使用组合来代替继承。因此这里我们就不再对类适配器模式进行介绍(其实用的也很少)。
四、举例
接着上面举的画图程序的例子,先来看看在添加绘制圆的需求前的类结构:
添加了圆的绘制以后的类结构:
可以看出 Shape、Circle 和TextCircle 三者的关系是和标准适配器模式中Target、Apater、Apatee 三者的关系相对应的。我们只关心这个画图程序中是怎么来使用适配器模式的。看看Circle 的实现代码吧:
class Circle extends Shape
{
//这里引用了TextCircle
private TextCircle tc;
public Circle ()
{
tc= new TextCircle(); //初始化
}
void public display()
{
tc.displayIt(); //在规定的方法里面调用TextCircle 原来的方法
}
}
这样一个简单的适配器实现就完成了。
其实在适配器角色中不仅仅可以完成接口转换的过程,而且还可以对其功能进行改进和扩充,当然这就不属于适配器模式描述的范围内了。
前面我介绍过了代理模式,两者的主要区别在于代理模式应用的情况是不改变接口命名的,而且是对已有接口功能的一种控制;而适配器模式则强调接口转换。
五、题外话
在 java 中有一种叫做“缺省适配模式”的应用,它和我们所讲的适配器模式是完全的两种东西。缺省适配模式是为一个接口提供缺省的实现,这样子类型就可以从缺省适配模式中进行扩展,避免了从原有接口中扩展时要实现一些自己不关心的接口。在java.awt.event 中的XXXAdapter 就是它的很好的例子,有兴趣的可以看看。