来源:软件秘笈------设计模式那点事儿
适配器模式(Adapter Pattern)
定义:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因为接口不匹配而无法在一起工作的两个类能够在一起工作,又称为转换器模式、变压器模式、包装模式。
(1)对象适配器模式:在该模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器其调用被包裹的对象的物理实体。
(2)类适配器模式:在该模式下,适配器其继承自己实现的类。
下面以对象适配器为例。
模式类图结构:
使用场合:
(1)、软件系统结构需要升级或扩展,又不想影响原有系统的稳定运行的时候。
(2)、转换类三支箭的差别不是太大的时候。
(3)、像创建一个可以服用的类,该类可以与其他不相关的类,或不可预见的类协同工作的时候。
代码实现:
//电源基类,提供电压值和电源单位
package com.demo.power;
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;
}
}
//220V电源接口
package com.demo.power.v220;
public interface IPower220 {
public void output220v();
}
//220V电源
package com.demo.power.v220;
import com.demo.power.AbsBasePower;
public class Power220 extends AbsBasePower implements IPower220{
public Power220(){
super(220);
}
@Override
public void output220v() {
System.out.println("------- 这是"+this.getPower()+this.getUnit()+"电源-----");
}
}
//12V电源接口
package com.demo.power.v12;
public interface IPower12 {
//输出12v电压s
public void output12V();
}
//12V电源对象适配器
package com.demo.power.v12;
import com.demo.power.AbsBasePower;
public class AdapterPower12 implements IPower12 {
private final AbsBasePower absBasePower;
public AdapterPower12(AbsBasePower absBasePower){
this.absBasePower = absBasePower;
}
@Override
public void output12V() {
float powerFloat = this.absBasePower.getPower();
if(powerFloat == 380){
powerFloat /= 31.67f;
}
else if(powerFloat == 220){
powerFloat /= 18.33f;
}
else if (powerFloat == 110){
powerFloat /= 9.17f;
}
else{
System.out.println("不能适配电源");
}
//处理转换结果
powerFloat = (int) (powerFloat * 10)/10.0f;
System.out.println("------- 这是"+powerFloat+this.absBasePower.getUnit()+"电源-----");
}
}
//测试对象适配器
package com.demo;
import com.demo.power.v12.AdapterPower12;
import com.demo.power.v12.IPower12;
import com.demo.power.v220.Power220;
public class Client {
public static void main(String[] args){
Power220 power220 = new Power220();
System.out.println("适配器转换之前");
power220.output220v();
System.out.println("适配器开始转换。。。。。。");
System.out.println("适配器转换之后");
IPower12 adapterPower12 = new AdapterPower12(power220);
adapterPower12.output12V();
}
}