适配器模式
结构型模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。它联合了两个独立接口的性能。
这种模式波及到一个繁多的类,该类负责退出独立的或不兼容的接口性能。
介绍
用意:将一个类的接口转换成客户心愿的另外一个接口。适配器模式使得本来因为接口不兼容而不能一起工作的那些类能够一起工作。
次要解决:次要解决在软件系统中,经常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
何时应用: 1、零碎须要应用现有的类,而此类的接口不合乎零碎的须要。 2、想要建设一个能够重复使用的类,用于与一些彼此之间没有太大关联的一些类,包含一些可能在未来引进的类一起工作,这些源类不肯定有统一的接口。 3、通过接口转换,将一个类插入另一个类系中。(比方老虎和走兽,当初多了一个飞虎,在不减少实体的需要下,减少一个适配器,在外面容纳一个虎对象,实现飞的接口。)
如何解决:继承或依赖(举荐)。
要害代码:适配器继承或依赖已有的对象,实现想要的指标接口。
利用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要应用 1.2 的 JDK,则要将以前零碎的 Enumeration 接口转化为 Iterator 接口,这时就须要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。
具体实现
第一种(类适配器)
第一步:创立被适配的类
public class Voltage220V { public int output220V() { int src = 220; System.out.println("电压=" + src + "伏"); return src; }}
第二步:创立适配的接口
public interface IVoltage5V { int output5V();}
第三步:创立适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V { @Override public int output5V() { int srcV = output220V(); //转成 5V 电压 int dst = srcV / 44; return dst; }}
第四步:创立手机类
public class Phone { //充电 public void charging(IVoltage5V iVoltage5V) { if (iVoltage5V.output5V() == 5) { System.out.println("电压5V,失常,能够充电"); } else { System.out.println("电压不失常,无奈充电"); } }}
第五步:创立测试用例
public class Client { public static void main(String[] args) { System.out.println(" === 类适配器模式 ===="); Phone phone = new Phone(); phone.charging(new VoltageAdapter()); }}
长处:
因为适配器类是适配者类的子类,因而能够再适配器类中置换一些适配者的办法,使得适配器的灵活性更强。
毛病:
因为Java是单继承机制,所以须要适配的必须是接口,存在肯定的局限性。
第二种(对象适配器)
第一步:创立被适配的类
public class Voltage220V { public int output220V() { int src = 220; System.out.println("电压=" + src + "伏"); return src; }}
第二步:创立适配的接口
public interface IVoltage5V { int output5V();}
第三步:创立适配器类
public class VoltageAdapter implements IVoltage5V { private Voltage220V voltage220V; //通过结构器传入Voltage220V实例,进行聚合 public VoltageAdapter(Voltage220V voltage220V) { this.voltage220V = voltage220V; } @Override public int output5V() { int dst = 0; if (null != voltage220V) { int src = voltage220V.output220V(); dst = src / 44; System.out.println("适配实现,输入的电压为:" + dst); } return dst; }}
第四步:创立手机类
public class Phone { //充电 public void charging(IVoltage5V iVoltage5V) { if (iVoltage5V.output5V() == 5) { System.out.println("电压5V,失常,能够充电"); } else { System.out.println("电压不失常,无奈充电"); } }}
第五步:创立测试用例
public class Client { public static void main(String[] args) { System.out.println(" === 对象适配器模式 ===="); Phone phone = new Phone(); phone.charging(new VoltageAdapter(new Voltage220V())); }}
长处:
对象适配器和类适配器其实是同一种思维,只是实现形式不同,依据合成复用准则,应用组合代替继承,解决了类适配器的问题,更加灵便。
毛病:
与类适配器模式相比,要想置换适配者类的办法就不容易。