【设计模式】职责链模式,MySQL+Tomcat+JVM,看完还怕面试官
前言
從3月份開始,打算找工作,一個偶然的機會,拉勾上一個螞蟻金服的師兄找到我,說要內推,在此感謝姚師兄,然后就開始了螞蟻金服的面試之旅。把簡歷發過去之后,就收到了郵件通知,10個工作日聯系我,請耐心等待。
沒過2天就接到一個杭州的座機,說要約我進行電話面試,效率還是挺高,然后當天晚上就進行了一面。下班后,吃了飯,專門找了一條人比較少的小路,到了7點,電話準時打過來了。
那這篇博客是不是就這樣結束了呢?當然不是,重點才剛剛開始。
上面的職責鏈模式讓人看起來很別扭,那是因為還沒有優化過,我們發現再三個子類中都需要調用下一個處理器對不對,這樣是不是比較麻煩,如果有人再添加處理器的時候忘記調用下一個處理器呢?bug是不是就來了,然后你就需要加班了,所以這種事情必須要扼殺在搖籃里,我們直接不在子類中調用下一個處理器,我們把調用下一個處理器放到抽象父類中,讓他統一處理,就能完美解決了。
請看代碼
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler
-
@Author: 流星007
-
@Description: 處理器抽象父類
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public abstract class Handler {
/**
- 下一個處理器
*/
protected Handler nextHandler = null;
/**
-
設置下一個處理器
-
@param nextHandler
*/
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final void handler(){
boolean flag = doHandler();
if(!flag && nextHandler!= null){
nextHandler.handler();
}
}
/**
- 處理器處理請求
*/
protected abstract boolean doHandler();
}
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler1
-
@Author: 流星007
-
@Description: 處理器1
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class Handler1 extends Handler {
@Override
public boolean doHandler() {
System.out.println(“這是第一個handler,無法解決此問題,請求下一個處理器處理”);
return false;
}
}
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler2
-
@Author: 流星007
-
@Description: 處理器2
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class Handler2 extends Handler {
@Override
public boolean doHandler() {
System.out.println(“這是第二個handler,無法解決此問題,請求下一個處理器處理”);
return false;
}
}
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler3
-
@Author: 流星007
-
@Description: 處理器3
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class Handler3 extends Handler {
@Override
public boolean doHandler() {
boolean flag = true;
System.out.println(“這是第三個handler,問題解決,無需在往下執行”);
if(flag){
return true;
}
System.out.println(“執行結束,沒有處理器能夠解決這個請求”);
return false;
}
}
其他代碼不變,我們發現,調用下一個處理器的代碼被移動了抽象父類處理器Handler中,自立只需要安安心心的處理自己的邏輯即可,是不是降低的bug的產生率?
這里有個小知識點,大家直到我在抽象父類:Handler中為什么將handler();設置為final嗎?知道的可以卸載評論區哦。
[](()使用數組實現職責鏈模式
==========================================================================
這種實現方式比上面那種基于鏈表的實現方式更為簡單,也更容易理解,廢話不多說,直接上代碼
package com.liuxing.handler;
/**
-
@ProjectName: demo
-
@Package: com.liuxing.handler
-
@ClassName: IHandler
-
@Author: 流星007
-
@Description: 處理器接口
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Date: 2020/7/13 17:17
-
@Version: 1.0
*/
public interface IHandler {
boolean handler();
}
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler1
-
@Author: 流星007
-
@Description: 處理器1
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class Handler1 implements IHandler {
@Override
public boolean handler() {
System.out.println(“這是第一個handler,無法解決此問題,請求下一個處理器處理”);
return false;
}
}
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler2
-
@Author: 流星007
-
@Description: 處理器2
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class Handler2 implements IHandler {
@Override
public boolean handler() {
System.out.println(“這是第二個handler,無法解決此問題,請求下一個處理器處理”);
return false;
}
}
package com.liuxing.handler;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.handler
-
@ClassName: Handler3
-
@Author: 流星007
-
@Description: 處理器3
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class Handler3 implements IHandler{
@Override
public boolean handler() {
boolean flag = true;
System.out.println(“這是第三個handler,問題解決,無需在往下執行”);
if(flag){
return true;
}
System.out.println(“執行結束,沒有處理器能夠解決這個請求”);
return false;
}
}
package com.liuxing.chain;
import com.liuxing.handler.Handler;
import com.liuxing.handler.IHandler;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
-
@ProjectName: handler-of-responsibility-pattern
-
@Package: com.liuxing.chain
-
@ClassName: ChainHandler
-
@Author: 流星007
-
@Description: 處理器鏈
-
csdn:https://blog.csdn.net/qq_33220089
-
今日頭條:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523
-
@Version: 1.0
*/
public class ChainHandler {
/**
- 所有的處理器
*/
private List list = new ArrayList();
/**
-
添加處理器
-
@param handler
*/
public void addHandler(IHandler handler){
list.add(handler);
}
/**
- 開始執行handler
*/
public void handler(){
if(CollectionUtils.isEmpty(list)){
return ;
}
for(IHandler handler: list){
if(handler.handler()){
return;
}
}
}
}
package com.liuxing.test;
import com.liuxing.chain.ChainHandler;
import com.liuxing.handler.Handler1;
import com.liuxing.handler.Handler2;
import com.liuxing.handler.Handler3;
public class HandlerTest {
public static void main(String[] args) {
ChainHandler chainHandler = new ChainHandler();
chainHandler.addHandler(new Handler1());
chainHandler.addHandler(new Handler2());
chainHandler.addHandler(new Handler3());
chainHandler.handler();
}
}
《一線大廠Java面試真題解析+Java核心總結學習筆記+最新全套講解視頻+實戰項目源碼》開源
Java優秀開源項目:
- ali1024.coding.net/public/P7/Java/git
總結
上述知識點,囊括了目前互聯網企業的主流應用技術以及能讓你成為“香餑餑”的高級架構知識,每個筆記里面幾乎都帶有實戰內容。
很多人擔心學了容易忘,這里教你一個方法,那就是重復學習。
打個比方,假如你正在學習 spring 注解,突然發現了一個注解@Aspect,不知道干什么用的,你可能會去查看源碼或者通過博客學習,花了半小時終于弄懂了,下次又看到@Aspect 了,你有點郁悶了,上次好像在哪哪哪學習,你快速打開網頁花了五分鐘又學會了。
從半小時和五分鐘的對比中可以發現多學一次就離真正掌握知識又近了一步。
人的本性就是容易遺忘,只有不斷加深印象、重復學習才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
ndler(new Handler2());
chainHandler.addHandler(new Handler3());
chainHandler.handler();
}
}
《一線大廠Java面試真題解析+Java核心總結學習筆記+最新全套講解視頻+實戰項目源碼》開源
Java優秀開源項目:
- ali1024.coding.net/public/P7/Java/git
總結
上述知識點,囊括了目前互聯網企業的主流應用技術以及能讓你成為“香餑餑”的高級架構知識,每個筆記里面幾乎都帶有實戰內容。
很多人擔心學了容易忘,這里教你一個方法,那就是重復學習。
打個比方,假如你正在學習 spring 注解,突然發現了一個注解@Aspect,不知道干什么用的,你可能會去查看源碼或者通過博客學習,花了半小時終于弄懂了,下次又看到@Aspect 了,你有點郁悶了,上次好像在哪哪哪學習,你快速打開網頁花了五分鐘又學會了。
從半小時和五分鐘的對比中可以發現多學一次就離真正掌握知識又近了一步。
[外鏈圖片轉存中…(img-fORJ2hQF-1649669341343)]
人的本性就是容易遺忘,只有不斷加深印象、重復學習才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
總結
以上是生活随笔為你收集整理的【设计模式】职责链模式,MySQL+Tomcat+JVM,看完还怕面试官的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断四个点是否在同一个平面上
- 下一篇: 写一个最简单的mysql编程_要学简单的