适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。类图如下:
类的适配器模式:Adapter与Adaptee是继承关系。
对象的适配器模式:Adapter和Adaptee不是继承关系,而是使用委派关系连接到Adaptee类。
举个栗子:
指方为圆:客户接收一个正方体,返还此正方体的内切球。 类图和代码如下:
package adapter;
//适配器模式的源角色
public class Cube {
private double width;
public Cube(double width){
this.width = width;
}
//计算体积
public double calculateVolume(){
return width * width * width;
}
//计算面积
public double calculateFaceArea(){
return width * width;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
}
package adapter;
//目标接口角色
public interface BallIF {
/**
* 计算面积
*/
public double calculateArea();
/**
* 计算体积
*/
public double calculateVolume();
/**
* 半径的取值方法
*/
public double getRadius();
/**
* 半径的赋值方法
*/
public void setRadius(double radius);
}
package adapter;
//适配器角色
public class MagicFinger implements BallIF {
private double radius = 0;
private static final double PI = 3.14d;
private Cube adaptee;
public MagicFinger(Cube adaptee){
this.adaptee = adaptee;
radius = this.adaptee.getWidth()/2.0d;
}
@Override
public double calculateArea() {
return PI * (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;
}
}
适配器模式源码:适配器模式代码demo,欢迎下载