1、基本概念
适配器模式( Adapter Pattern )又叫做变压器模式,它的功能是将一个类的接口变成客户端所期望
的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作 ,属于结构型设
计模式。
如我们常见的充电器,变压器
2、类图和角色
角色:
目标角色:接口,如5v或9v的手机
源角色:需要转换的,如220v的电压
适配器:将源角色转换目标角色的实例,如5v/9v的充电器
3、适配器类型
适配器有三种形式:类适配器,对象适配器,接口适配器
3.1、类适配器
类图:
适配器继承AC220V类,实现DC5V接口
接口:DC5V
public interface DC5V { int output5v(); }
源角色:AC220V类
public class AC220V { public int output220v(){ System.out.printf("输出电压:%dv ",220); return 220; } }
适配器:
public class Adapter extends AC220V implements DC5V { @Override public int output5v() { int output220v = super.output220v(); int output5v = output220v / 44; System.out.printf("转换:%dv电压 ——》 %d v电压 ",output220v,output5v); return output5v; } }
测试:
public class Test { public static void main(String[] args) { Adapter adapter = new Adapter(); int output5v = adapter.output5v(); System.out.printf("输入电压:%dv",output5v); } }
输出:
输出电压:220v 转换:220v电压 ——》 5 v电压 输入电压:5v
3.2、对象适配器
和类适配器的区别是,对象适配器采用的是组合方式代替继承方式
那么这里的适配器就是这样写:
public class Adapter implements DC5V { private AC220V ac220V; public Adapter(AC220V ac220V){ this.ac220V = ac220V; } @Override public int output5v() { int output220v = ac220V.output220v(); int output5v = output220v / 44; System.out.printf("转换:%dv电压 ——》 %d v电压 ",output220v,output5v); return output5v; } }
3.3、接口适配器:
假如目标对象是5v,12v,24v,36v,48v等,那我们的各种适配器就需要空实现很多方法,
例如:
接口:
public interface DC { int output5v(); int output12v(); int output24v(); int output48v(); }
48v适配器:
public class A48vAdapter implements DC { @Override public int output5v() { return 0; } @Override public int output12v() { return 0; } @Override public int output24v() { return 0; } @Override public int output48v() { return 0; } }
每个适配器会有很多空方法,所以加上一个抽象的适配器
public abstract class AbstractAdapter implements DC { public AC220V ac220V; public AbstractAdapter(AC220V ac220V){ this.ac220V = ac220V; } @Override public int output5v() { return 0; } @Override public int output12v() { return 0; } @Override public int output24v() { return 0; } @Override public int output48v() { return 0; } }
让其他适配器继承抽象适配器
public class A5vAdapter extends AbstractAdapter { public A5vAdapter(AC220V ac220V) { super(ac220V); } @Override public int output5v() { int output220v =super.ac220V.output220v(); int output5v = output220v / 44; System.out.printf("转换:%dv电压 ——》 %d v电压 ",output220v,output5v); return output5v; } }
public class A24vAdapter extends AbstractAdapter { public A24vAdapter(AC220V ac220V) { super(ac220V); } @Override public int output24v() { int output220v =super.ac220V.output220v(); int output24v = 24; System.out.printf("转换:%dv电压 ——》 %d v电压 ",output220v,output24v); return output24v; } }
4、优缺点
优点:提高代码的扩展性,符合开闭原则。