做者:叄滴水\
博客:https://blog.csdn.net/qq_3028...java
有的手機沒有耳機插口,若是想使用圓形插口的耳機,就須要經過一個轉接頭進行適配。適配器模式就是這樣的一個做用,做爲兩個不兼容的接口之間的橋樑。面試
映射到代碼中,能夠想到登陸,如今的登陸方式有不少種,帳號密碼登陸,短信登陸,還有不少第三方登陸(qq登陸,微信登陸)等等。每一種登陸接收的參數都不同(插口不同)。spring
假如項目剛剛開發,只有一個帳號密碼登陸設計模式
代碼以下(示例):傳入帳號密碼,判斷是否正確,以後設置各類日誌信息,設置session等等。微信
public class LoginService { // 帳號密碼登陸 public void login(UserInfo user){ System.out.println("帳號密碼登陸"); UserInfo userInfo = userMapper.getUserInfo(user.getUserName(),user.getPassword()); // 設置登陸日誌 // 設置session // 等等各類操做此處省略 } }
假若有一天,產品大大要加入短信登陸,短信登陸只有手機號和驗證碼。session
代碼以下(示例):建立SmsLoginServiceintellij-idea
public class SmsLoginService extends LoginService { //手機號 //驗證碼 @Override public void login(UserInfo user){ System.out.println("短信登陸"); //驗證驗證碼是否正確 this.checkCode(user.getMobile(),user.getCode()); UserInfo userInfo = this.userMapper.getUserInfo(user.getMobile()); super.login(userInfo); } }
短信登陸service繼承LoginService,重寫login方法,而後轉換成帳號密碼登陸須要的參數信息進行登陸。app
代碼以下(帳號密碼登陸):ide
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方法轉換成帳號密碼登陸須要的參數,來進行適配。工具
public class UserInfo { private Long id; private String userName; private String password; private String mobile; private String openId;// 線上可能一我的多個openId private String code; }
這種寫法,確實簡化了部分代碼,可是總感受有一點點的牽強,由於實際狀況中,常常會多個設計模式一塊兒使用。
好比登陸的時候能夠分爲 驗證用戶信息,生成用戶憑證,記錄日誌,3個步驟。這個時候就能夠引入模板模式來固定流程的執行順序。
或者說在進行選擇某一種登陸的時候,會不會出現多個if/else的判斷呢?那麼可不能夠引入策略模式呢?
設計模式是根據場景來靈活的運用,杜絕爲了使用設計模式而是用設計模式。要學會後發制人,化有行爲無形,不管怎麼寫,代碼最終講究的是優雅、靈活。
另外,想學習更多的策略模式,能夠關注公衆號Java技術棧,在後臺回覆:設計模式,能夠獲取我整理的設計模式教程,都是實戰乾貨。
本文來自做者「叄滴水」投稿,謝謝分享,也歡迎愛好技術分享的各位技術朋友向「Java技術棧」投稿,讓更多人看到,投稿方式:關注公衆號「Java技術棧」在後臺回覆:投稿。
近期熱文推薦:
1.600+ 道 Java面試題及答案整理(2021最新版)
2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!
3.阿里 Mock 工具正式開源,幹掉市面上全部 Mock 工具!
4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!
以爲不錯,別忘了隨手點贊+轉發哦!