相親交友原始碼第三方登入的實現及易擴充套件的達成
1 使用類介面卡重構第三方登入自由適配
我們使用適配模式來實現相親交友原始碼的業務場景,解決實際問題。很早以前開發的老系統應該都有登入介面,但是隨著業務的發展和社會的進步,單純地依賴使用者名稱密碼登入顯然不能滿足使用者需求。現在,大部分相親交友原始碼系統都已經支援多種登入方式,如QQ登入、微信登入、手機登入、微博登入等,同時保留使用者名稱密碼的登入方式。雖然登入形式豐富,但是登入後的處理邏輯可以不必改,都是將登入狀態儲存到Session,遵循開閉原則。首先建立統一的返回結果ResultMsg類。
/** * Created by Tom. */ public class ResultMsg { private int code; private String msg; private Object data; public ResultMsg(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 setData(Object data) { this.data = data; } }
假設在老系統中,處理登入邏輯的程式碼在PassportService類中。
public class PassportService { /** * 註冊方法 * @param username * @param password * @return */ public ResultMsg regist(String username,String password){ return new ResultMsg(200,"註冊成功",new Member()); } /** * 登入方法 * @param username * @param password * @return */ public ResultMsg login(String username,String password){ return null; } }
為了遵循開閉原則,不修改老系統的程式碼。下面開啟程式碼重構之路,建立Member類。
/** * Created by Tom. */ public class Member { private String username; private String password; private String mid; 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 getMid() { return mid; } public void setMid(String mid) { this.mid = mid; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
我們也不改動執行非常穩定的程式碼,建立Target角色IPassportForThird介面。
public interface IPassportForThird { ResultMsg loginForQQ(String openId); ResultMsg loginForWechat(String openId); ResultMsg loginForToken(String token); ResultMsg loginForTelphone(String phone,String code); }
建立Adapter角色實現相容,建立一個新的類PassportForThirdAdapter,繼承原來的邏輯。
public class PassportForThirdAdapter extends PassportService implements IPassportForThird { public ResultMsg loginForQQ(String openId) { return loginForRegist(openId,null); } public ResultMsg loginForWechat(String openId) { return loginForRegist(openId,null); } public ResultMsg loginForToken(String token) { return loginForRegist(token,null); } public ResultMsg loginForTelphone(String phone, String code) { return loginForRegist(phone,null); } private ResultMsg loginForRegist(String username,String password){ if(null == password){ password = "THIRD_EMPTY"; } super.regist(username,password); return super.login(username,password); } }
相親交友原始碼客戶端測試程式碼如下。
public static void main(String[] args) { PassportForThirdAdapter adapter = new PassportForThirdAdapter(); adapter.login("tom","123456"); adapter.loginForQQ("sjooguwoersdfjhasjfsa"); adapter.loginForWechat("slfsjoljsdo8234ssdfs"); }
2 使用介面介面卡優化相親交友原始碼程式碼
通過這麼一個簡單的適配動作,我們完成了相親交友原始碼程式碼相容。當然,程式碼還可以更加優雅,根據不同的登入方式,建立不同的Adapter。首先建立LoginAdapter介面。
public interface ILoginAdapter { boolean support(Object object); ResultMsg login(String id,Object adapter); }
然後建立一個抽象類AbstractAdapter繼承PassportService原有的功能,同時實現ILoginAdapter介面,再分別實現相親交友原始碼不同的登入適配,QQ登入LoginForQQAdapter。
public class LoginForQQAdapter extends AbstractAdapter{ public boolean support(Object adapter) { return adapter instanceof LoginForQQAdapter; } public ResultMsg login(String id, Object adapter) { if(!support(adapter)){return null;} //accesseToken //time return super.loginForRegist(id,null); } }
手機登入LoginForTelAdapter。
public class LoginForTelAdapter extends AbstractAdapter{ public boolean support(Object adapter) { return adapter instanceof LoginForTelAdapter; } public ResultMsg login(String id, Object adapter) { return super.loginForRegist(id,null); } }
Token自動登入LoginForTokenAdapter。
public class LoginForTokenAdapter extends AbstractAdapter { public boolean support(Object adapter) { return adapter instanceof LoginForTokenAdapter; } public ResultMsg login(String id, Object adapter) { return super.loginForRegist(id,null); } }
微信登入LoginForWechatAdapter。
public class LoginForWechatAdapter extends AbstractAdapter{ public boolean support(Object adapter) { return adapter instanceof LoginForWechatAdapter; } public ResultMsg login(String id, Object adapter) { return super.loginForRegist(id,null); } }
接著建立介面卡PassportForThirdAdapter類,實現目標介面IPassportForThird完成相容。
public class PassportForThirdAdapter implements IPassportForThird { public ResultMsg loginForQQ(String openId) { return processLogin(openId, LoginForQQAdapter.class); } public ResultMsg loginForWechat(String openId) { return processLogin(openId, LoginForWechatAdapter.class); } public ResultMsg loginForToken(String token) { return processLogin(token, LoginForTokenAdapter.class); } public ResultMsg loginForTelphone(String phone, String code) { return processLogin(phone, LoginForTelAdapter.class); } private ResultMsg processLogin(String id,Class<? extends ILoginAdapter> clazz){ try { ILoginAdapter adapter = clazz.newInstance(); if (adapter.support(adapter)){ return adapter.login(id,adapter); } } catch (Exception e) { e.printStackTrace(); } return null; } }
相親交友原始碼客戶端測試程式碼如下。
public static void main(String[] args) { IPassportForThird adapter = new PassportForThirdAdapter(); adapter.loginForQQ("sdfasdfasfasfas"); }
最後來看如下圖所示的類圖。
至此,在遵循開閉原則的前提下,我們完整地實現了一個相容多平臺登入的相親交友原始碼業務場景。當然,目前的這個設計並不完美,僅供參考,感興趣的小夥伴們可以繼續完善這段程式碼。
學習到這裡,相信小夥伴們會有一個疑問:介面卡模式與策略模式好像區別不大?我要強調一下,介面卡模式主要解決的是相親交友原始碼功能相容問題,單場景適配可能不會和策略模式有對比。但複雜場景適配大家就很容易混淆。
其實,大家有沒有發現一個細節,筆者給每個介面卡類都加上了一個support()方法,用來判斷是否相容,support()方法的引數型別也是Object,而support()來自介面。介面卡類的實現邏輯並不依賴介面,完全可以將ILoginAdapter介面去掉。而加上介面,只是為了相親交友原始碼規範。上面程式碼可以說是策略模式、簡單工廠模式和介面卡模式的綜合運用。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2840858/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何快速搞定第三方登入且易擴充套件?套件
- 相親交友原始碼實現相親直播間,移動終端的優化方案原始碼優化
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- 相親交友原始碼開發,前端如何實現水印功能?原始碼前端
- 如何在相親交友原始碼中實現正方形驗證碼輸入框?原始碼
- 如何實現相親交友原始碼的CPU效能優化?解決方案梳理原始碼優化
- 搭建相親交友原始碼 ,API 介面統一格式返回的實現原始碼API
- 相親交友原始碼實現程式內快取,提升高併發能力!原始碼快取
- 相親交友原始碼中語音連麥的實現方式,值得一看原始碼
- 用Shell擴充套件實現原始碼統計程式套件原始碼
- 相親交友原始碼開發,演算法的定義及複雜度分析原始碼演算法複雜度
- 相親交友原始碼開發中,Redis的三種限流方式原始碼Redis
- 相親交友原始碼中的事件循壞,你瞭解多少?原始碼事件
- 在相親交友原始碼中實現視訊連麥直播需要哪些步驟?原始碼
- 相親交友原始碼的架構設計,實現合成複用原則需要如何做?原始碼架構
- PostgreSQL 原始碼解讀(216)- 實現簡單的擴充套件函式SQL原始碼套件函式
- 相親交友原始碼開發,前端API如何請求快取?原始碼前端API快取
- 相親交友原始碼前端效能優化,通常使用哪些手段?原始碼前端優化
- PHPWAMP安裝Redis擴充套件的方式與相關擴充套件的下載PHPRedis套件
- Laravel Bss 專案中用到的第三方擴充套件一,驗證碼擴充套件包Laravel套件
- MinIO分散式叢集的擴充套件方案及實現分散式套件
- [外掛擴充套件]qq登入外掛套件
- 將單點登入擴充套件到雲套件
- COLA的擴充套件性使用和原始碼研究套件原始碼
- 擴充套件JAAS,XMLPolicyFile實現套件XML
- 基於PHP擴充套件的WAF實現PHP套件
- dubbo是如何實現可擴充套件的?套件
- 相親交友原始碼開發中會用到的幾種日期處理方法原始碼
- hyperf Dockerfile 配置及 PHP 第三方擴充套件的安裝DockerPHP套件
- Dubbo原始碼解析之SPI(一):擴充套件類的載入過程原始碼套件
- shiro安全框架擴充套件教程--如何擴充套件實現我們的快取機制(第三方容器redis,memcached)框架套件快取Redis
- 在相親原始碼開發中,如何實現圓角及特殊圓角的使用?原始碼
- [API 寫法] 基於 socialite 擴充套件包做的 蘋果登入 (apple 登入)API套件蘋果APP
- django實現自定義manage命令的擴充套件Django套件
- PHP實現Bitmap的探索 - GMP擴充套件使用PHP套件
- dubbo是如何實現可擴充套件的?(二)套件
- PHP 容器中安裝原始碼包中的擴充套件PHP原始碼套件
- PHP原始碼系列之擴充套件的原理與開發PHP原始碼套件