一個(gè)登錄案例,學(xué)會(huì)適配器設(shè)計(jì)模式!
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
作者:叁滴水
博客:https://blog.csdn.net/qq_30285985/
前言
有的手機(jī)沒有耳機(jī)插口,如果想使用圓形插口的耳機(jī),就需要通過一個(gè)轉(zhuǎn)接頭進(jìn)行適配。適配器模式就是這樣的一個(gè)作用,作為兩個(gè)不兼容的接口之間的橋梁。
映射到代碼中,可以想到登錄,現(xiàn)在的登錄方式有很多種,賬號(hào)密碼登錄,短信登錄,還有很多第三方登錄(qq登錄,微信登錄)等等。每一種登錄接收的參數(shù)都不一樣(插口不一樣)。

一、代碼示例
1.賬號(hào)密碼登錄
假如項(xiàng)目剛剛開發(fā),只有一個(gè)賬號(hào)密碼登錄
代碼如下(示例):傳入賬號(hào)密碼,判斷是否正確,之后設(shè)置各種日志信息,設(shè)置session等等。
public class LoginService {
// 賬號(hào)密碼登錄
public void login(UserInfo user){
System.out.println("賬號(hào)密碼登錄");
UserInfo userInfo = userMapper.getUserInfo(user.getUserName(),user.getPassword());
// 設(shè)置登錄日志
// 設(shè)置session
// 等等各種操作此處省略
}
}
2.短信登錄
假如有一天,產(chǎn)品大大要加入短信登錄,短信登錄只有手機(jī)號(hào)和驗(yàn)證碼。
代碼如下(示例):創(chuàng)建SmsLoginService
public class SmsLoginService extends LoginService {
//手機(jī)號(hào)
//驗(yàn)證碼
@Override
public void login(UserInfo user){
System.out.println("短信登錄");
//驗(yàn)證驗(yàn)證碼是否正確
this.checkCode(user.getMobile(),user.getCode());
UserInfo userInfo = this.userMapper.getUserInfo(user.getMobile());
super.login(userInfo);
}
}
短信登錄service繼承LoginService,重寫login方法,然后轉(zhuǎn)換成賬號(hào)密碼登錄需要的參數(shù)信息進(jìn)行登錄。另外,關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):設(shè)計(jì)模式,可以獲取我整理的 Java 設(shè)計(jì)模式系列教程,不斷更新中。
3.微信登錄
代碼如下(賬號(hào)密碼登錄):
public class WechatLoginService extends LoginService {
//微信登錄
// user中只有openId
@Override
public void login(UserInfo user){
System.out.println("微信登錄");
//通過openId 獲取用戶信息
UserInfo userInfo = userMapper.getUserInfo(user.getOpenId());
super.login(userInfo);
}
}
同理,微信登錄也可以繼承LoginServie,重寫login方法轉(zhuǎn)換成賬號(hào)密碼登錄需要的參數(shù),來進(jìn)行適配。
public class UserInfo {
private Long id;
private String userName;
private String password;
private String mobile;
private String openId;// 線上可能一個(gè)人多個(gè)openId
private String code;
}
這種寫法,確實(shí)簡(jiǎn)化了部分代碼,但是總感覺有一點(diǎn)點(diǎn)的牽強(qiáng),因?yàn)閷?shí)際情況中,經(jīng)常會(huì)多個(gè)設(shè)計(jì)模式一起使用。
比如登錄的時(shí)候可以分為 驗(yàn)證用戶信息,生成用戶憑證,記錄日志,3個(gè)步驟。這個(gè)時(shí)候就可以引入模板模式來固定流程的執(zhí)行順序。
或者說在進(jìn)行選擇某一種登錄的時(shí)候,會(huì)不會(huì)出現(xiàn)多個(gè)if/else的判斷呢?那么可不可以引入策略模式呢?
設(shè)計(jì)模式是根據(jù)場(chǎng)景來靈活的運(yùn)用,杜絕為了使用設(shè)計(jì)模式而是用設(shè)計(jì)模式。要學(xué)會(huì)后發(fā)制人,化有行為無形,無論怎么寫,代碼最終講究的是優(yōu)雅、靈活。
另外,想學(xué)習(xí)更多的策略模式,可以關(guān)注公眾號(hào)Java技術(shù)棧,在后臺(tái)回復(fù):設(shè)計(jì)模式,可以獲取我整理的設(shè)計(jì)模式教程,都是實(shí)戰(zhàn)干貨。
本文來自作者「叁滴水」投稿,謝謝分享,也歡迎愛好技術(shù)分享的各位技術(shù)朋友向「Java技術(shù)棧」投稿,讓更多人看到,投稿方式:關(guān)注公眾號(hào)「Java技術(shù)棧」在后臺(tái)回復(fù):投稿。






關(guān)注Java技術(shù)棧看更多干貨


