设计模式
适配器模式
适配器模式(Adapter Pattern)是把一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作, 又称为转换器模式, 变压器模式, 包装(Wrapper)模式(把已有的一些类包装起来, 使之有能满足需要的接口). 适配器共分两种适模式. 无论哪种适配器, 它的宗旨都是保留现有类所提供的服务, 向客户提供接口, 以满足客户的期望. 即在不改变原有系统的基础上, 提供新的接口服务.
-
对象适配器模式---在这种适配器模式中, 适配器容纳一个它包裹的类的实例. 在这种情况下, 适配器调用被包裹对象的物理实体.
- 类适配器模式---在这种适配器模式下, 适配器继承自己实现的类.
设计原则
- 在适配器设计模式中, 使用对象组合的方式, 以目标接口包装被适配者, 这样使得被适配者的任何子类都可以被适配器使用. 适配器模式将被适配者和目标接口绑定在一起, 而不是和实现进行绑定, 这样更利于系统的升级和扩展.
- 适配器设计模式体现了"开-闭"原则. 在原有系统结构的基础上, 使用适配器将原有接口转换成另外一种接口, 既不影响原有系统的稳定运行, 又能有效地扩展新功能, 使得软件系统结构具有很强的健壮性. 另外, 就算没有源程序也没问题, 适配器模式可以让已经建立好的类符合新建的接口标准, 而不必修改原有的类.
Java JDK中的适配器模式
- java.io.InputStreamReader和java.io.OutputStreamWriter就是比较典型的适配器
与桥接模式和装饰者模式的区别
- 与桥接模式的区别: 适配器模式是将一种接口转换为另外一种接口的设计模式, 而桥接模式则是把实现和它的接口分开, 以便它们可以独立地变化. 桥接模式并不是用来把一个已有的对象接到不相匹配的接口上的.
- 与装饰都模式的区别: 适配器模式主要用来填补两个接口之间的差异, 而装饰者模式则是需要更改接口, 就可以新增功能的调试模式.
使用场合
- 软件系统结构需要升级或扩展, 又不想影响原有系统的稳定运行的时候.
- 转换类之间的差别不是太大的时候.
- 想创建一个可以复用的类, 该类可以与其他不相关的类或不可预见的类协同工作的时候.
实现代码
//电源基类 public abstract class AbsBasePower01 { private float power; private String unit = "V"; public AbsBasePower01(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电源接口 public interface IPower22001 { public void output220v(); }
//12V电源接口 public interface IPower1201 { public void output12v(); }
//12V电源接口 public interface IPower1201 { public void output12v(); }
//12V电源实现类 public class Power1201 extends AbsBasePower01 implements IPower1201 { public Power1201() { super(12); } public void output12v() { System.out.println("-------This is " + super.getPower() + super.getUnit() + " power-------"); } }
//对象适配器实现类 public class AdapterPower1201 implements IPower1201 { //待转换的对象 private final AbsBasePower01 basePower01; public AdapterPower1201(AbsBasePower01 basePower01) { this.basePower01 = basePower01; } public void output12v() { //获得外部电源值 float power = this.basePower01.getPower(); //进行电源转换 if(380 == power) power = power / 31.67f; else if(220 == power) power = power / 18.33f; else if(110 == power) power = power / 9.17f; else { System.out.println("-------不能适配电源-------"); return; } power = (int)(power * 10) / 10.0f; System.out.println("-------This is " + power + this.basePower01.getUnit() + " power-------"); } }
//类适配器实现 public class ApapterPower12Ext01 extends AbsBasePower01 implements IPower1201 { public ApapterPower12Ext01(AbsBasePower01 power) { super(power.getPower()); } public void output12v() { //获得外部电源值 float power = super.getPower(); //进行电源转换 if(380 == power) power = power / 31.67f; else if(220 == power) power = power / 18.33f; else if(110 == power) power = power / 9.17f; else { System.out.println("-------不能适配电源-------"); return; } power = (int)(power * 10) / 10.0f; System.out.println("-------This is " + power + super.getUnit() + " power-------"); } }
//客户端 public class ClienMain { public static void main(String[] args) { Power22001 power_220 = new Power22001(); power_220.output220v(); IPower1201 power_120 = new Power1201(); power_120.output12v(); System.out.println("\n -------适配器转换中"); IPower1201 adapter_power_12 = new AdapterPower1201(power_220); adapter_power_12.output12v(); System.out.println("\n -------适配器转换中"); IPower1201 adapter_power_12_ext = new ApapterPower12Ext01(power_220); adapter_power_12_ext.output12v(); } }