这里以一个“指方为圆”的例子来说明适配器模式的原理和简单应用,本例子来自《Java 与模式》。
1. 类图
2. Java实现代码
package cn.edu.ynu.sei.adapter;
/**
* 球体接口<br>
*
* @author 88250
* @version 1.0.0, 2007-8-28
*/
public interface BallF
{
/**
* 计算表面积
* @return
*/
public double calculateArea();
/**
* 计算体积
* @return
*/
public double calculateVolume();
/**
* 返回半径值
* @return
*/
public double getRadius();
/**
* 设置半径值
* @param radius
*/
public void setRadius(double radius);
}
/**
* 球体接口<br>
*
* @author 88250
* @version 1.0.0, 2007-8-28
*/
public interface BallF
{
/**
* 计算表面积
* @return
*/
public double calculateArea();
/**
* 计算体积
* @return
*/
public double calculateVolume();
/**
* 返回半径值
* @return
*/
public double getRadius();
/**
* 设置半径值
* @param radius
*/
public void setRadius(double radius);
}
package cn.edu.ynu.sei.adapter;
/**
* 正方体类<br>
* 这是对象的适配器模式的源角色
*
* @author 88250
* @version 1.0.0, 2007-8-28
*/
public class Cube
{
private double width;
/**
* 构造器
* @param width
*/
public Cube(double width)
{
this.width = width;
}
/**
* 计算体积
* @return
*/
public double calculateVolume()
{
return width * width * width;
}
/**
* 计算表面积
* @return
*/
public double calculateFaceArea()
{
return 6 * width * width;
}
/**
* @return the width
*/
public double getWidth()
{
return width;
}
/**
* @param width the width to set
*/
public void setWidth(double width)
{
this.width = width;
}
}
/**
* 正方体类<br>
* 这是对象的适配器模式的源角色
*
* @author 88250
* @version 1.0.0, 2007-8-28
*/
public class Cube
{
private double width;
/**
* 构造器
* @param width
*/
public Cube(double width)
{
this.width = width;
}
/**
* 计算体积
* @return
*/
public double calculateVolume()
{
return width * width * width;
}
/**
* 计算表面积
* @return
*/
public double calculateFaceArea()
{
return 6 * width * width;
}
/**
* @return the width
*/
public double getWidth()
{
return width;
}
/**
* @param width the width to set
*/
public void setWidth(double width)
{
this.width = width;
}
}
package cn.edu.ynu.sei.adapter;
/**
* 该类扮演了“指方为圆”适配器角色
*
* @author 88250
* @version 1.0.0, 2007-8-28
*/
public class MagicFinger implements BallF
{
private double radius;
private static final double PI = 3.1415926D;
private Cube adaptee;
public MagicFinger(Cube adaptee)
{
super();
this.adaptee = adaptee;
radius = adaptee.getWidth();
}
@Override
public double calculateArea()
{
return PI * 4.0D * (radius * radius);
}
@Override
public double calculateVolume()
{
return PI * (4.0D / 3.0D) * (radius * radius * radius);
}
@Override
public double getRadius()
{
return radius;
}
@Override
public void setRadius(double radius)
{
this.radius = radius;
}
}
/**
* 该类扮演了“指方为圆”适配器角色
*
* @author 88250
* @version 1.0.0, 2007-8-28
*/
public class MagicFinger implements BallF
{
private double radius;
private static final double PI = 3.1415926D;
private Cube adaptee;
public MagicFinger(Cube adaptee)
{
super();
this.adaptee = adaptee;
radius = adaptee.getWidth();
}
@Override
public double calculateArea()
{
return PI * 4.0D * (radius * radius);
}
@Override
public double calculateVolume()
{
return PI * (4.0D / 3.0D) * (radius * radius * radius);
}
@Override
public double getRadius()
{
return radius;
}
@Override
public void setRadius(double radius)
{
this.radius = radius;
}
}
3. 总结
上面实现的是对象的适配器模式,即源角色为类。如果源角色为接口的话则为类的适配器模式,这里不再赘述。我们经常使用的JDBC就是一个适配器模式的具体应用,还有Linux下的Wine模拟器(可模拟Windows程序)也是适配器模式的应用。