跟着《软件秘笈---设计模式那点事》学习
定义:
适配器模式(Adapter Pattern),把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。
(1)对象适配器模式
(2)类适配器模式
角色:
(1)目标接口(Target):客户所期待的接口。目标可以是具体类抽象类,也可以是接口
(2)需要适配的类(Adaptee):
(3)适配器,通过包装一个需要适配的对象,把原接口转换目标接口。
类图:
实例:
/**
* 抽象电源基类
*/
public abstract class AbsBasePower {
// 电压值
private double power;
// 单位
private String unit = "V";
public AbsBasePower(double power) {
this.power = power;
}
public double getPower() {
return power;
}
public void setPower(double power) {
this.power = power;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
/*
* 220V电源接口
* */
public interface IPower220 {
// 220V交流电打印
public void output220v();
}
/**
* 220V电源
*/
public class Power220 extends AbsBasePower implements IPower220 {
public Power220() {
super(220);
}
/*
* 220V输出
*/
@Override
public void output220v() {
System.out.println("----这是[" + this.getPower() + this.getUnit() + "]电源。。。。");
}
}
/*
* 12V电源接口
* */
public interface IPower12 {
// 12V交流电打印
public void output12v();
}
/**
* 12V电源
*/
public class Power12 extends AbsBasePower implements IPower12 {
public Power12() {
super(12);
}
/*
* 220V输出
*/
@Override
public void output12v() {
System.out.println("----这是[" + this.getPower() + this.getUnit() + "]电源。。。。");
}
}
客户端
public class Client {
public static void main(String[] args) {
//首先生成一个220V对象
Power220 power220 = new Power220();
power220.output220v();
//接下来生成一个12V对象
Power12 power12 = new Power12();
power12.output12v();
}
}
/**
* 12V电源适配器(实现目标对象接口,即12V电源接口)
*/
public class AdapterPower12 implements IPower12 {
// 待转换对象
private final AbsBasePower absBasePower;
// 适配器构造方法,将待转换对象传入
public AdapterPower12(AbsBasePower absBasePower) {
this.absBasePower = absBasePower;
}
// 实现目标对象方法
@Override
public void output12v() {
// 获得外部电源值
double powerFloat = this.absBasePower.getPower();
// 进行电源转换
if (powerFloat == 380) {
powerFloat = powerFloat / 31.67D;
} else if (powerFloat == 220) {
powerFloat = powerFloat / 18.33D;
} else if (powerFloat == 110) {
powerFloat = powerFloat / 9.17D;
} else {
System.out.println("-----不能适配电源。。。。。");
}
// 处理结果转换
powerFloat = (int) (powerFloat * 10) / 10.0D;
System.out.println("这是[" + powerFloat + this.absBasePower.getUnit() + "]电源。。。。。");
}
}
public class Client {
public static void main(String[] args) {
//首先生成一个220V对象
Power220 power220 = new Power220();
power220.output220v();
//接下来生成一个12V对象
Power12 power12 = new Power12();
power12.output12v();
//使用适配器把220V转换成12V
System.out.println("\n----电源适配器转接中。。。。");
IPower12 adapterPower12 = new AdapterPower12(power220);
adapterPower12.output12v();
System.out.println("----电源适配器转换结束。。。。");
}
}
分析:
适配器模式体现了两个设计原则,一是使用对象组合,面向接口和抽象编程,二是开闭原则,不赘述。
产品继承一个接口,实现一个抽象类,接口作为产品标识,抽象类作为实体,实体是可以转化的,实现接口的适配器来负责这种转换。
使用场合:
(1)软件系统结构需要升级或扩展,又不想影响原油系统的稳定运行的时候;
(2)转换类之间差别不是太大的时候;
(3)想创建一个可以服用的类,改类可以与其他的不相关的类或不可预见的类协同工作的时候。
一句话总结:
以目标接口包装被适配者。
Java SDK中的原型模式:
参考资料:
《软件秘笈---设计模式那点事》