設計模式之介面卡模式(結構型,需要一個轉換頭,用來相容)
阿新 • • 發佈:2019-02-12
介紹
標準定義:將一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
通俗理解:我們日常用的讀卡器就是一個介面卡,記憶體卡不能直接插入筆記本,需要將記憶體卡先插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取記憶體卡。
案例
場景:有一個老系統運行了很久,目前十分穩定,不便再去修改裡面的程式碼。但是為了相容新的需求或標準,我們不得不對老系統再去做一些文章(向下相容),那怎麼去保證滿足新需求的同時,又能夠讓老系統繼續穩定呢?這裡採用介面卡模式,拿使用者的登入註冊為例,以前的老系統只能是使用者名稱密碼登入,而現在需要滿足第三方QQ、微信登入。
程式碼:
1》老系統的登入註冊類
public class SignService {
/**
* 使用者註冊
* @param username
* @param password
* @return
*/
public ResultMsg register(String username,String password){
return new ResultMsg("200","註冊成功",new User());
}
/**
* 使用者登入
* @param username
* @param password
* @return
*/
public ResultMsg login(String username,String password){
return new ResultMsg("200","登入成功",new User());
}
}
2》新系統的登入註冊類,繼承老系統的登入註冊類
public class SignForThirdService extends SignService {
//第三方QQ登入
public ResultMsg loginForQQ(String openid){
//1.openid是全域性唯一的,我們可以把它當成是一個使用者名稱
//2.密碼預設為taofut_xxx,這個只有我們內部開發人員知道
//3.註冊(在原有的系統裡註冊一個使用者)
//4.呼叫原來的登入方法
return loginForRegist(openid,"taofut_xxx");
}
//第三方微信登入
public ResultMsg loginWechat(String openid){
return null;
}
//拿到token重新登入
public ResultMsg loginForToken(String token){
return null;
}
//手機號+驗證碼登入
public ResultMsg loginForTel(String tel,String code){
return null;
}
//註冊並登入
public ResultMsg loginForRegist(String username,String password){
//呼叫原來的註冊方法
super.register(username,password);
//呼叫原來的登入方法
return super.login(username,password);
}
}
3》使用者資訊類
public class User {
private String username;
private String password;
private String uid;
private String info;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
4》登入註冊返回結果類
public class ResultMsg {
private String code;
private String msg;
private Object data;
public ResultMsg(String code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
5》測試類
public class AdapterTest {
public static void main(String[] args) {
SignForThirdService signForThirdService=new SignForThirdService();
//不改變原來的程式碼,也要相容新的需求
signForThirdService.loginForQQ("ddssss123ddsdsddsdsd");
}
}
總結:以上這個例子就是採用介面卡模式,既要保證老系統原來的穩定性,又要滿足現有的需求。原來老系統的登入註冊方法不能改,那麼我們就用一個新的登入註冊類去繼承原有的登入註冊類,在呼叫第三方QQ登入介面的同時,把openid當成一個使用者名稱,呼叫原來的註冊方法,密碼內部自己定義一個,建立一個新的使用者。然後再呼叫原來的登入方法,將新使用者的使用者名稱密碼傳過去完成登入。這裡,只是呼叫了老系統的登入註冊方法,而沒去改變它的程式碼,穩定性保證了,也實現了第三方登入。介面卡模式往往是一種相容思想。