界说
适配器形式(Adapter Pattern)又叫做变压器形式,它的功用是将一个类的接口变成客户端所希望的另一种接口,从而使原本因接口不匹配二导致无法在曾经作业的两个类,能够一起作业。在不改动原有代码的情况下,接口和抽象类的差异对原有功用的一种转化、扩展,使得原有的功用能够满足新的需求。
三种写法
- 类适配http 500器
- 方针适接口的效果配器
- 接口适配器
一、类适配器(体系http协议存在的人物转化成方针需求的内容)
场景说明:现有220V电压。需求是接口和抽象类的差异能够输出5V电压一起也能够输出220V电压。
需求通过220V电压转化成5V电压输出,因此在不改动2接口文档20V电压类的腾讯视频下载情况下,
添加5V电压。新增5V电压接口http协议,新增适配器类,适配器类腾讯加速器继承220V电压,结束5V电压接口。
在适配器类处理220V转化5V的逻辑,毕竟结束能够输出5V电压。
/**
* 原有类
*/
public class AC220 {
public int outputAC220V(){
int output = 220;
System.out.println("输出电压" + output + "V");
return output;
}
}
/**
* 新增办法(模板类)
*/
pub腾讯体育l接口和抽象类的差异ic interface DC5 {
int output接口检验5V ();
}
/**
* 类适配器类
*/
public class PowerAdapter extends AC220 implements DC5 {
@Overridhttp 500e
public int output5V() {
int adapterInput = super.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.println("运腾讯nba用Adapter输入AC" + adapterInput + "V,输出腾讯体育AC"+adapterOutput+"V");
return adapterOutput;
}
}
/**
* 检验
*/
public class Test {
public static void main(String[] args) {
DC5 adapter = new PowerAdapter();
adapter.output5V();
}
}
二、方针适配器(体接口crc过错计数系存在的人物转化成方针需求的内容)
场景说明:需求通过220V电压http://www.baidu.com转化成5V电压,只需求5V电压,而不保存22V电压。
新增5V电压接口,新增适配器类结构办法入参为220V电压,结束DC5V接口,
在结束的output5V()办法里边结束220V转5V的逻辑。客户端调用适配器,只需DC5V腾讯请求微户贷商标的办法。
public class AC220 {
public int outputAC220V(){
int output = 220;
System.out.println("输出电压" + output + "V");
return output;
}
}
/**
* 新增办法(方针类)
*/
public interface DC5 {
in接口crc过错计数t output5V();
}
/**
* 方针适配器
* 契合最小知道原则,适配器只需AC的办法
*/
public class PowerAdapter implements DC5 {
private AC220 ac220;
p接口crc过错计数ublic PowerAdapter(AC220 ac220) {
this.ac220 =http署理 ac220;
}
@Override
public int output5V() {
int adapterInput = ac220.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.phttps和http的差异rintln("运http://www.baidu.com用Adapter输入AC" + adapterIn腾讯漫画pu腾讯nbat + "V,输出AC"+adapterOutput+"V");
return adapterOutput;
}
}
public class Test {
public s腾讯客服tatic void main(String[] args) {
DC5 adapter = new PowerAdapter(new AC220());
adapter.output5V();
}
}
三、接口适配器
接口适配器
/**
* 原有类
*/
public class AC220 {
public int outp腾讯客服utAC220V(){
int ou接口文档tput = 220;
System.out.println("输出电压" + output + "V");
return output;
}
}
publichttps和http的差异 interface DC {
int接口类型 output5接口的效果V();腾讯客服
i接口和抽象类的差异nt output12V();
int output24V();
int output3https和http的差异6();
}
/**
* 2、方针适配器
* 违反了接口阻隔和单一职接口的效果责原则,把所以功用集合在一起削减类的相关关系
*/
public cl腾讯ass PowerAdapter implements DC {
private AC2腾讯漫画20 ac220;
public PowerAdapter(AC220 ac220) {
this.ac220 = ac220;
}
@Override
public int output5V() {
i腾讯nbant output = ac220.outputAChttp://192.168.1.1登录220V() / 44;
return output;
}
@Override
public int output12V() {
int output = ac220.ohttp://www.baidu.comutputAC220V() / 18;
return outpu接口文档t;
}
@Override
public int output24V()接口 {
int output = ac220.outputAC220V() / 9;
return output;
}接口的界说
@Override
public int output36() {
int output = acHTTP220.outputAC220V() / 6;
return outp腾讯地图ut;
}
}
public class Test {
public static void main(Strin腾讯请求微户贷商标g[] args) {
DC adapter = new腾讯漫画 PowerAdapter(new AC220(接口和抽象类的差异));
adapter.output5V();
}
}http 404
四、登录比如
布景:原项目https和http的差异只需注册,登录账号,现有的注册登录办法很安稳,现在腾讯地图需求添加第三方HTTP登录,底层仍是调用旧的注册登录办法。
办法一
缺点:不容易再度扩展,此时假设再添加,微博登录..接口的界说.等等。需求改接口,改动适配器。不契合开闭原则。
p腾讯加速器ublic class ResultMsg {
private int code;
private Str腾讯nbaing msg;
privathttpcliente Object data;
public Re接口检验面试题sultMsg(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;腾讯漫画
}
public int getCode() {
return code接口是什么;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setD腾讯加速器ata(Object data) {
this.data = data;
}
}
/**
* 原有类
*/
pu接口卡bhttp://www.baidu.comlic c腾讯体育lass PassportService {
/**
* 注册办法
* @param username
* @param password
* @return
*/
public ResultMsg regist(String username,String password) {
return new ResultMsg(200,"HTTP注册成功http://www.baidu.com",new Memb接口检验er());
}
/**
* 登录办法
* @param username
* @param password
* @return
*/
public ResultMsg login(String腾讯加速器 username,String password) {
return new ResultMsg(200,"登录成功",new Member());
}
}
/**
* 方针接口
*/
public interface接口类型 IPassportForOther {
ResultMsg loginF腾讯orQQ(String openId);
ResultMsg loginForWechat(String o腾讯漫画penId);
ResultMsg loginForToken(String token)接口检验;
ResultMsg loginForTelphone(Strinhttp署理g phone,Stringhttp://192.168.1.1登录 code);
}
/**
* 方针接口适配器
*/
public class PassportF腾讯会议orOth接口erAdapter extends PassportService implements IPassportForOther {
@Override
public ResultMsg loginForQQ(String openId) {
// TODO 这儿要跟腾讯SDK对接,代码逻辑很长,导致这个类很臃肿
return lohttp 500ginForRegist(openId,null);
}
@Override
public ResultMsg loginForWechat(String openId) {
return接口的效果 loginForRegist(openId,null);
}
@Override
public ResultMsg loginForToken(String token) {
return loginForRegist(token,null);
}
@Override
publhttp协议ic ResultMsg log接口类型inForTelphone(String phone, String code) {
/http 500/ TODO 这儿要跟第三方短信平台对接,代码逻辑很长,导致这个类很臃肿
return loginFor接口文档Regist(phttps和http的差异hone,null);
}
/**
* 第三方登http://www.baidu.com录不可能用暗码登录
* 所以约好第三方登录的时分https和http的差异设置一个默许的第三方通用THIRD_EMPTY,后台做一个符号假设是THhttp 404IRD_EMPTY这个暗码,则不走正常流程
* 假设有用户设置暗码时httpclient不能设置这个暗码,提示暗码无效,请从头设置
* @param username
* @parahttp://www.baidu.comm password
* @return
*/
private Reshttps和http的差异ultMsg log腾讯加速器inForRegist(String username,String password) {
// 约好,暗码为空,运用内置登录暗码,并
if(null == phttp 302a腾讯漫画ssword) {
password = "THIR腾讯体育D_EMPTY";
}
super.regist(uhttp://192.168.1.1登录shttp协议ername,password);
return suhttp署理per.login(username,password);
}
}
/*接口卡*
* 检验类
*/
public class Test {
public static void main(String[] ar接口检验gs接口检验面试题) {
PassportForOth接口的界说erAdapter adapter = nehttp://192.168.1.1登录w PassportForOtherAdapter();
adapter.login("admin","123456");
adapter.loginForQQ("sdfgsfghs");// QQ供给的仅有的开发ID
adapter.接口的效果loginForWechat("falkjkjnkvf");// 微信供给的仅有的接口crc过错计数敞开ID
}
}
进阶
办法一的结束办法不契合开闭原则。进阶版思http署理路:用两个适配器,一个总适配器,起到调度的效果,每种登录办法都写一个适配器,添加登录办法,接口文档添加适配器类,不需求改动原有的代码,只需添加类。
/**
* 原有类
*/
public class PassportService {
/**
* 注册办法
* @param us腾讯会议ername
* @param password腾讯会议
* @return
*/
public ResultMsg regist(Strin接口和抽象类的差异ghttp 302 username,String password) {
return new ResultMsg(200,"注册成功",new Member());
}
/**
* 登录办法
* @param username
*腾讯地图 @param password
* @return
*/
public ResultMsg login(String username,String password) {
return new ResultMsg(200,"登录成功",new Member());
}
}
public class ResultMsg {
privat接口是什么e int code;
private String msg;
private Object data;
public ResultMsg(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
thi接口检验面试题s.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return腾讯会议 msg;
}
public void setMsg(Strin接口类型g腾讯 m腾讯会议sg) {
this.ms腾讯视频下载g = msg;
}接口检验面试题
public Object getData() {
return data;
}
public void sHTTPetData(Object data) {
this.腾讯data = dathttp 302a;
}
}
/**
* 登录适配器接口
*/
public interface ILoginAdapter {
/腾讯/ 适配器是否匹配
boolean support(Object object);
// 调用第三方SDK获取登录的token
String to腾讯漫画ken();
}
public interface IPassportForOther {
ResultMsg loginForOther腾讯会议();
}
public class LoginForQQAdapter implements ILoginAdapter{
@Override
public boolean support(Object object) {
return false;
}
@Override
public String token() {
System.out.println(腾讯先游"发送http央求");
System.out.printl接口文档n("QQ登录,QQ回来的仅有ID->");
String username = "admin";
return username;
}
}
/**
* 对外供给的适配器
*/
public class PassportForOtherAdapter接口检验 extends PassportService implements IPassportForOther{
pr腾讯视频下载ivate ILoginAdapter loginAdapter;
public PassportForOtherAdapter(ILoginAdapter loginAdapter) {
this.接口文档loginhttp 404Adapter = loginAdapter;
}
/**
* 第三方登http://192.168.1.1登录录
* @r接口eturn
*/
@Override
public ResultMsg loginForOther() {
return loginForRegist(lohttp 404ginAdapter.token(),null);
}
/**
* 第三方登录不可能用暗码登录,仿照注册之后再登录
* 所以约好第三方登录的时分设置一个默许的第三方通用THIRD_EMPTY,后台做一个符号假设是THIRD_EMPTY这个暗码,则不走正常流程
* 假设有用户设置暗码时不能设置这个暗码,提示腾讯体育暗码无效,请从头设置
*
* @param username
* @param腾讯视频下载 passw腾讯客服ord
* @return
*/腾讯先游
protected ResultMsg loginForRegist(String userHTTPname, Strhttpwatching password) {
if腾讯nba (null == password) {
password = "THIR腾讯先游D_EMPTY";
}
s接口类型uper.regis腾讯加速器t(username, password);
return super.lohttp 500gin(username, password)腾讯漫画;
}
}
public class Test {
public s接口的效果tatic void main(Strihttp署理ng[] args) {
IPassportForOther adapter =腾讯加速器 new PassportForOtherAdapter(new LoginForQQAdapter());
adapter.loginForOthehttp署理r();
}
}