一模式定义
存在两种适配器模式
1 对象适配器模式,在这种适配器模式中,适配器容纳一个它包裹的类对象的物理实体。
2 类适配器模式,在这种适配器模式中,适配器继承自已实现的类。
二模式举例
1模式分析
我们借用笔计本电源适配器来说明这一模式。
已经存在的交流电源
笔记本电脑
电源适配器
2适配器模式的静态建模
3代码举例
3.1抽象电源建立
package com.demo.power;
/**
* 电源基类
*
* @author
*
*/
public abstract class AbsBasePower
{
// 电压值
private float power;
// 单位
private String unit = "V";
// 构造方法
public AbsBasePower(float power)
{
this.power = power;
}
public float getPower()
{
return power;
}
public void setPower(float power)
{
this.power = power;
}
public String getUnit()
{
return unit;
}
public void setUnit(String unit)
{
this.unit = unit;
}
}
3.2 220v电源接口
package com.demo.power.v220;
/**
* 220V 电源接口
*
* @author
*
*/
public interface IPower220 {
// 220V交流电源打印
public void output220v();
}
3.3 220v电源实现类
package com.demo.power.v220;
import com.demo.power.AbsBasePower;
/**
* 220V电源
*
* @author
*
*/
public class Power220 extends AbsBasePower implements IPower220
{
// 构造方法
public Power220()
{
super(220);
}
// 220V电源输出
public void output220v()
{
System.out.println("----这是[" + this.getPower() + this.getUnit() + "]电源!...");
}
}
3.4 12v电源接口
package com.demo.power.v12;
/**
* 12V 电源接口
*
* @author
*
*/
public interface IPower12 {
// 12V电源打印
public void output12v();
}
3.5 12v电源实现类
package com.demo.power.v12;
import com.demo.power.AbsBasePower;
/**
* 正常的12V电源
*
* @author
*
*/
public class Power12 extends AbsBasePower implements IPower12 {
// 12V电源构造方法
public Power12() {
super(12);
}
// 12V电源输出
public void output12v() {
System.out.println("----这是[" + this.getPower() + this.getUnit()
+ "]电源!...");
}
}
3.6 12v电源对象适配器
package com.demo.adapter;
import com.demo.power.AbsBasePower;
import com.demo.power.v12.IPower12;
/**
* 电源适配器 (实现目标对象接口 即:12V电源接口)
*
* @author
*
*/
public class AdapterPower12 implements IPower12 {
// 待转换的对象
private final AbsBasePower absBasePower;
// 适配器构造方法 将待转换对象传入
public AdapterPower12(AbsBasePower absBasePower) {
this.absBasePower = absBasePower;
}
// 实现目标对象方法
public void output12v() {
// 获得外部电源值
float powerFloat = this.absBasePower.getPower();
// 进行电源转换
if (powerFloat == 380) {
// 380V电源转换
powerFloat = powerFloat / 31.67f;
} else if (powerFloat == 220) {
// 220V电源转换
powerFloat = powerFloat / 18.33f;
} else if (powerFloat == 110) {
// 110V电源转换
powerFloat = powerFloat / 9.17f;
} else {
System.out.println("----不能适配电源!...");
return;
}
// 处理转换结果
powerFloat = (int) (powerFloat * 10) / 10.0f;
System.out.println("----这是[" + powerFloat + this.absBasePower.getUnit()
+ "]电源!...");
}
}
3.7 12v电源类适配器
package com.demo.adapter;
import com.demo.power.AbsBasePower;
import com.demo.power.v12.IPower12;
/**
* 电源适配器 (实现目标对象接口 即:12V电源接口) 类适配器 模式
*
* @author
*
*/
public class AdapterPower12Ext extends AbsBasePower implements IPower12 {
// 适配器构造方法 将待转换对象传入
public AdapterPower12Ext(AbsBasePower absBasePower) {
super(absBasePower.getPower());
}
// 实现目标对象方法
@Override
public void output12v() {
// 获得外部电源值
float powerFloat = this.getPower();
// 进行电源转换
if (powerFloat == 380) {
// 380V电源转换
powerFloat = powerFloat / 31.67f;
} else if (powerFloat == 220) {
// 220V电源转换
powerFloat = powerFloat / 18.33f;
} else if (powerFloat == 110) {
// 110V电源转换
powerFloat = powerFloat / 9.17f;
} else {
System.out.println("----不能适配电源!...");
return;
}
// 处理转换结果
powerFloat = (int) (powerFloat * 10) / 10.0f;
System.out.println("----这是[" + powerFloat + this.getUnit() + "]电源!...");
}
}
3.8 测试适配器
package com.demo;
import com.demo.adapter.AdapterPower12;
import com.demo.adapter.AdapterPower12Ext;
import com.demo.power.v12.IPower12;
import com.demo.power.v12.Power12;
import com.demo.power.v220.Power220;
/**
* 客户端程序调用
*
* @author
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// 我们首先 生成一个220V电源对象!
Power220 power220 = new Power220();
power220.output220v();
// 接下来,我们在生成一个12V电源对象!
IPower12 power12 = new Power12();
power12.output12v();
// 最后,我们使用电源适配器 将220V电源转换为12V电源!
System.out.println("\n----电源适配器转换中...");
IPower12 adapterPower12 = new AdapterPower12(power220);
adapterPower12.output12v();
System.out.println("----电源适配器转换结束!");
// 类适配器实现
System.out.println("\n----类适配器 电源适配器转换中...");
IPower12 adapterPower12Ext = new AdapterPower12Ext(power220);
adapterPower12Ext.output12v();
System.out.println("----类适配器 电源适配器转换结束!");
}
}
3.9 运行结果
----这是[220.0V]电源!...
----这是[12.0V]电源!...
----电源适配器转换中...
----这是[12.0V]电源!...
----电源适配器转换结束!
----类适配器 电源适配器转换中...
----这是[12.0V]电源!...
----类适配器 电源适配器转换结束!
三 设计原则
1使用对象组合,面向接口和抽象编程
2“开一闭”原则
四 使用场合
1软件系统结构需要升级或扩展,又不想影响原有系统稳定运行的时候
2转换类之间的差別不是很大的时候
3想创建一个可以复用的类,该类可以与其他不相关类或不可预见类协同工作的时候
五 类适配器模式和对象适配器模式的静态类图