做者:叄滴水\
博客:https://blog.csdn.net/qq_3028...前端
委派模式不屬於23種設計模式,可是spring中出現了委派模式的影子,委派模式從字面上便可大概想到這個模式的含義,即想作有些事,可是我本身不想作,那麼我委派給你作。java
老闆讓經理去作一個項目,經理確定不會親自去作,會合理的安排給本身的手下去完成這個項目。這時委派模式的含義就比較清楚了。面試
網上太多老闆安排經理作事的例子,在此!spring
適配器模式也是經過登陸進行示例的。可是設計模式老是多個結合使用的,單單使用適配器模式會顯得有一點點的瑕疵。設計模式
好比,若是每種方式登陸成功以後要設置登陸的日誌信息,而且每種登陸方式的token生成策略若是不同的話,單個的適配器模式是沒法使得代碼更加美觀。intellij-idea
引入委派模式,能夠認爲是當前對象知道要作某些事,可是卻不會具體的實現,比如經理知道天天的任務,可是具體實現的時候要交給本身的小弟去作。app
代碼以下(抽象類):ide
public abstract class AbstractLoginService { public void login(UserInfo user){ System.out.println("帳號密碼登陸"); UserInfo userInfo = userMapper.getUserInfo(user.getUserName(),user.getPassword()); this.getToken(); this.sendLog(); // 等等各類操做此處省略 } // 設置登陸日誌 public abstract void sendLog(); // 獲取token public abstract void getToken(); }
建立抽象類,建立抽象方法sendLog
和getToken
,子類繼承抽象類,實現抽象方法。工具
代碼以下(短信登陸示例):學習
public class SmsLoginService extends AbstractLoginService { //手機號 //驗證碼 @Override public void login(UserInfo user){ System.out.println("短信登陸"); //驗證驗證碼是否正確 this.checkCode(user.getMobile(),user.getCode()); UserInfo userInfo = null;//this.userMapper.getUserInfo(user.getMobile()); super.login(userInfo); } @Override public void sendLog() { System.out.println("這裏設置短信登陸日誌信息"); } @Override public void getToken() { System.out.println("獲取短信登陸token"); } private void checkCode(String mobile, String code) { System.out.println("驗證驗證碼"); } }
子類實現抽象方法後,能夠實現不一樣的登陸方式的發送登陸日誌和獲取token的實現各不相同。
委派模式即一件事情(或一個請求)對象自己不知道怎樣處理,對象把請求交給其它對象來作。
在spring源碼中能夠看到更多委派模式的代碼示例,
例如:
AbstractApplicationContext
類中obtainFreshBeanFactory
方法中的refreshBeanFactory
方法,和我這個例子相似,主類不關注或者說不知道如何實現refreshBeanFactory
方法,交給子類實現,達到了委派的效果。DispatcherServlet
這個springMVC的前端控制器或者說這就是一個轉發器。全部的信息都會通過這個類,可是這個類缺只是轉發,具體實現委派給了HandlerMapping
、視圖解析器等等。達到了委派的效果。另外,想學習更多的策略模式,能夠關注公衆號Java技術棧,在後臺回覆:設計模式,能夠獲取我整理的設計模式教程,都是實戰乾貨。
本文來自做者「叄滴水」投稿,謝謝分享,也歡迎愛好技術分享的各位技術朋友向「Java技術棧」投稿,讓更多人看到,投稿方式:關注公衆號「Java技術棧」在後臺回覆:投稿。
近期熱文推薦:
1.600+ 道 Java面試題及答案整理(2021最新版)
2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!
3.阿里 Mock 工具正式開源,幹掉市面上全部 Mock 工具!
4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!
以爲不錯,別忘了隨手點贊+轉發哦!