什么适配器?what

适配器模式 - 图1
适配器即:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决:主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的。
例如:现在的手机都没专门的耳机接口了,但是手机上的Type-C接口实现了有充电、文件传输、音频传输功能;
但是不能直接将现有的音频通过Type-C接口输出,需要一个Type-C转耳机接口的适配器;

怎么实现适配器?how

用上面手机Type-C的例子实现代码如下:
IPhoneTypeC.java

  1. /**
  2. * 手机type-C功能
  3. */
  4. public interface IPhoneTypeC {
  5. void fileTransfer(String fileName);
  6. void powerTransfer(String fileName);
  7. }

Type-C接口有两个功能 充电和传输文件
传输文件TypeCForFile

  1. public class TypeCForFile implements IPhoneTypeC {
  2. @Override
  3. public void fileTransfer(String fileName) {
  4. System.out.println("file transfer fileName:"+fileName);
  5. }
  6. @Override
  7. public void powerTransfer(String fileName) {
  8. //do nothing
  9. }
  10. }

充电 TypeCForPower

  1. public class TypeCForPower implements IPhoneTypeC {
  2. @Override
  3. public void fileTransfer(String fileName) {
  4. //do nothing
  5. }
  6. @Override
  7. public void powerTransfer(String fileName) {
  8. System.out.println("power transfer fileName:"+fileName);
  9. }
  10. }

提供一个传输线 ITransfer

  1. /**
  2. * 手机type-c适配器 接口传输
  3. */
  4. public interface ITransfer {
  5. void transfer(String type,String fileName);
  6. }

文件传输或充电 FileOrPowerTransfer

  1. public class FileOrPowerTransfer implements ITransfer {
  2. private IPhoneTypeC iPhoneTypeC ;
  3. public FileOrPowerTransfer(String fileType){
  4. if("file".equals(fileType)){
  5. iPhoneTypeC= new TypeCForFile();
  6. }else if("power".equals(fileType)){
  7. iPhoneTypeC=new TypeCForPower();
  8. }
  9. }
  10. @Override
  11. public void transfer(String type,String fileName) {
  12. if("file".equals(type)){
  13. iPhoneTypeC.fileTransfer(fileName);
  14. }else if("power".equals(type)){
  15. iPhoneTypeC.powerTransfer(fileName);
  16. }
  17. }
  18. }

现在需要适配一个音乐播放MediaTransfer

  1. public class MediaTransfer implements ITransfer {
  2. private FileOrPowerTransfer fileTransfer;
  3. @Override
  4. public void transfer(String type, String fileName) {
  5. if("media".equals(type)){
  6. System.out.println("media transfer fileName:"+fileName);
  7. }else if("file".equals(type) ||"power".equals(type)){
  8. fileTransfer = new FileOrPowerTransfer(type);
  9. fileTransfer.transfer(type,fileName);
  10. }else{
  11. System.out.println(type+" format not supported");
  12. }
  13. }
  14. }

测试手机Type-c传输功能

  1. public static void main(String[] args) {
  2. ITransfer transfer = new MediaTransfer();
  3. transfer.transfer("file","简历.doc");
  4. transfer.transfer("power","....");
  5. transfer.transfer("avi","苍老师.avi");
  6. transfer.transfer("media","alone.mp3");
  7. }

输出结果

  1. file transfer fileName:简历.doc
  2. power transfer fileName:....
  3. avi format not supported
  4. media transfer fileName:alone.mp3

为什么使用适配器?why

我手中有个ps2插头的设备,但是主机上只有usb插头的插口,怎么办呢?弄个转换器,将ps2插头转换成为USB插头就可以使用了。
  接口Ps2:描述ps2接口格式
  接口Usb:描述USB接口格式
  类Usber:是接口Usb的实现类,是具体的USB接口格式
  Adapter:用于将ps2接口格式转换成为USB接口格式