目录
适配器模式的定义
将一个类的接口转成客户期望的另外一个接口。适配器模式使得原本由于接口不匹配而不能一起工作的那些类可以一起工作。
大白话
适配器模式就像旅行插座转换器(图1)、Type-c转VGA转接口一样。
图1.
图2.
去过香港迪拜等的同学都知道,那边用的插座跟我们不一样,他们的插座需要如图2第1面所示的插头,而我们常用的插座类似第2面。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。Type-c转VGA转接口也是一样的道理。
适配器模式结构图
如图所示,Client不能直接访问Adaptee。Adapter是适配器,它将Adaptee转换成Client能访问的接口。所以通过适配器Adapter,用户端就可以访问Adaptee。
适配器模式的实现举例
如图所示,这有一个适配器,一号口是typec口,二号口是vga口,只有将视频信号从typec口输入,转换输出到vga口,才能和投影仪对接,实现手机屏幕投影到投影仪上的任务。涉及的物品有:手机、适配器、投影仪。
定义一个手机,它有个typec口,这是视频源。
package com.jstao.adapter;
/**
* @author jstao
* 定义一个手机Phone,它有一个Typec接口。
*
*/
public class Phone {
public void typecPhone() {
System.out.println("信息从Typec口的手机输出。");
}
}
定义一个vga接口
package com.jstao.adapter;
/**
* @author jstao
* 定义一个VGA接口。
*
*/
public interface Vga {
void vgaInterface();
}
实现一个适配器,适配器实现方式分三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
类的适配器模式
原理:通过继承特性来实现适配器功能。
package com.jstao.adapter;
/**
*
* 实现一个Type-c转VGA适配器,
* 适配器实现方式有三种,这是第一种实现方式。
* @author jstao
*
*/
public class Typec2Vga1 extends Phone implements Vga{
@Override
public void vgaInterface() {
// TODO Auto-generated method stub
typecPhone();
System.out.println("接收到Type-c口信息,信息转换成VGA接口中...");
System.out.println("信息已转换成VGA接口,显示屏可以对接。");
}
}
对象的适配器模式
原理:通过组合方式来实现适配器功能。
package com.jstao.adapter;
/**
*
* 实现一个Type-c转VGA适配器,
* 适配器实现方式有三种,这是第二种实现方式。
* @author jstao
*
*/
public class Typec2Vga2 implements Vga{
private Phone phone;
public Typec2Vga2(Phone phone) {
// TODO Auto-generated constructor stub
this.phone = phone;
}
@Override
public void vgaInterface() {
// TODO Auto-generated method stub
if(phone != null) {
phone.typecPhone();
System.out.println("接收到Type-c口信息,信息转换成VGA接口中...");
System.out.println("信息已转换成VGA接口,显示屏可以对接。");
}
}
}
接口的适配器模式
原理:借助抽象类来实现适配器功能。
package com.jstao.adapter;
/**
* 定义接口
* @author jstao
*
*/
public interface Target {
void typec();
void typec2vga();
void typec2hdmi();
}
定义一个抽象类
package com.jstao.adapter;
/**
* 定义一个抽象类
* @author jstao
*
*/
public abstract class Adapter implements Target{
public void typec() { }
public void typec2vga() { }
public void typec2hdmi() { }
}
实现一个VGA适配器
package com.jstao.adapter;
/**
*
* 实现一个VGA适配器,同理还可以实现一个HDMI适配器
* 适配器实现方式有三种,这是第三种实现方式。
* @author jstao
*
*/
public class VgaAdapter extends Adapter{
public void typec() {
System.out.println("信息从Typec口的手机输出。");
}
public void typec2vga() {
System.out.println("接收到Type-c口信息,信息转换成VGA接口中...");
System.out.println("信息已转换成VGA接口,显示屏可以对接。");
}
}
定义一个显示屏,用来测试上面实现的三个适配器
package com.jstao.adapter;
/**
* 定义一个显示屏
* 与适配器对接
* @author jstao
*
*/
public class Screen {
public static void main(String[] args) {
//第一种适配器用法
System.out.println("-------------第一种适配器------------");
Vga vga = new Typec2Vga1();
vga.vgaInterface();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
//第二种适配器用法
System.out.println("-------------第二种适配器------------");
Typec2Vga2 typec2Vga1 = new Typec2Vga2(new Phone());
typec2Vga1.vgaInterface();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
//第三种适配器用法
System.out.println("-------------第三种适配器------------");
VgaAdapter vgaAdapter = new VgaAdapter();
vgaAdapter.typec();
vgaAdapter.typec2vga();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
}
}