相親交友原始碼第三方登入的實現及易擴充套件的達成

雲豹科技程式設計師發表於2021-11-05

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章