【设计模式】职责链模式,MySQL+Tomcat+JVM,看完还怕面试官
前言
從3月份開始,打算找工作,一個(gè)偶然的機(jī)會(huì),拉勾上一個(gè)螞蟻金服的師兄找到我,說要內(nèi)推,在此感謝姚師兄,然后就開始了螞蟻金服的面試之旅。把簡歷發(fā)過去之后,就收到了郵件通知,10個(gè)工作日聯(lián)系我,請(qǐng)耐心等待。
沒過2天就接到一個(gè)杭州的座機(jī),說要約我進(jìn)行電話面試,效率還是挺高,然后當(dāng)天晚上就進(jìn)行了一面。下班后,吃了飯,專門找了一條人比較少的小路,到了7點(diǎn),電話準(zhǔn)時(shí)打過來了。
那這篇博客是不是就這樣結(jié)束了呢?當(dāng)然不是,重點(diǎn)才剛剛開始。
上面的職責(zé)鏈模式讓人看起來很別扭,那是因?yàn)檫€沒有優(yōu)化過,我們發(fā)現(xiàn)再三個(gè)子類中都需要調(diào)用下一個(gè)處理器對(duì)不對(duì),這樣是不是比較麻煩,如果有人再添加處理器的時(shí)候忘記調(diào)用下一個(gè)處理器呢?bug是不是就來了,然后你就需要加班了,所以這種事情必須要扼殺在搖籃里,我們直接不在子類中調(diào)用下一個(gè)處理器,我們把調(diào)用下一個(gè)處理器放到抽象父類中,讓他統(tǒng)一處理,就能完美解決了。
請(qǐng)看代碼
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 {
/**
- 下一個(gè)處理器
*/
protected Handler nextHandler = null;
/**
-
設(shè)置下一個(gè)處理器
-
@param nextHandler
*/
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public final void handler(){
boolean flag = doHandler();
if(!flag && nextHandler!= null){
nextHandler.handler();
}
}
/**
- 處理器處理請(qǐng)求
*/
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(“這是第一個(gè)handler,無法解決此問題,請(qǐng)求下一個(gè)處理器處理”);
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(“這是第二個(gè)handler,無法解決此問題,請(qǐng)求下一個(gè)處理器處理”);
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(“這是第三個(gè)handler,問題解決,無需在往下執(zhí)行”);
if(flag){
return true;
}
System.out.println(“執(zhí)行結(jié)束,沒有處理器能夠解決這個(gè)請(qǐng)求”);
return false;
}
}
其他代碼不變,我們發(fā)現(xiàn),調(diào)用下一個(gè)處理器的代碼被移動(dòng)了抽象父類處理器Handler中,自立只需要安安心心的處理自己的邏輯即可,是不是降低的bug的產(chǎn)生率?
這里有個(gè)小知識(shí)點(diǎn),大家直到我在抽象父類:Handler中為什么將handler();設(shè)置為final嗎?知道的可以卸載評(píng)論區(qū)哦。
[](()使用數(shù)組實(shí)現(xiàn)職責(zé)鏈模式
==========================================================================
這種實(shí)現(xiàn)方式比上面那種基于鏈表的實(shí)現(xiàn)方式更為簡單,也更容易理解,廢話不多說,直接上代碼
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(“這是第一個(gè)handler,無法解決此問題,請(qǐng)求下一個(gè)處理器處理”);
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(“這是第二個(gè)handler,無法解決此問題,請(qǐng)求下一個(gè)處理器處理”);
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(“這是第三個(gè)handler,問題解決,無需在往下執(zhí)行”);
if(flag){
return true;
}
System.out.println(“執(zhí)行結(jié)束,沒有處理器能夠解決這個(gè)請(qǐng)求”);
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);
}
/**
- 開始執(zhí)行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核心總結(jié)學(xué)習(xí)筆記+最新全套講解視頻+實(shí)戰(zhàn)項(xiàng)目源碼》開源
Java優(yōu)秀開源項(xiàng)目:
- ali1024.coding.net/public/P7/Java/git
總結(jié)
上述知識(shí)點(diǎn),囊括了目前互聯(lián)網(wǎng)企業(yè)的主流應(yīng)用技術(shù)以及能讓你成為“香餑餑”的高級(jí)架構(gòu)知識(shí),每個(gè)筆記里面幾乎都帶有實(shí)戰(zhàn)內(nèi)容。
很多人擔(dān)心學(xué)了容易忘,這里教你一個(gè)方法,那就是重復(fù)學(xué)習(xí)。
打個(gè)比方,假如你正在學(xué)習(xí) spring 注解,突然發(fā)現(xiàn)了一個(gè)注解@Aspect,不知道干什么用的,你可能會(huì)去查看源碼或者通過博客學(xué)習(xí),花了半小時(shí)終于弄懂了,下次又看到@Aspect 了,你有點(diǎn)郁悶了,上次好像在哪哪哪學(xué)習(xí),你快速打開網(wǎng)頁花了五分鐘又學(xué)會(huì)了。
從半小時(shí)和五分鐘的對(duì)比中可以發(fā)現(xiàn)多學(xué)一次就離真正掌握知識(shí)又近了一步。
人的本性就是容易遺忘,只有不斷加深印象、重復(fù)學(xué)習(xí)才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
ndler(new Handler2());
chainHandler.addHandler(new Handler3());
chainHandler.handler();
}
}
《一線大廠Java面試真題解析+Java核心總結(jié)學(xué)習(xí)筆記+最新全套講解視頻+實(shí)戰(zhàn)項(xiàng)目源碼》開源
Java優(yōu)秀開源項(xiàng)目:
- ali1024.coding.net/public/P7/Java/git
總結(jié)
上述知識(shí)點(diǎn),囊括了目前互聯(lián)網(wǎng)企業(yè)的主流應(yīng)用技術(shù)以及能讓你成為“香餑餑”的高級(jí)架構(gòu)知識(shí),每個(gè)筆記里面幾乎都帶有實(shí)戰(zhàn)內(nèi)容。
很多人擔(dān)心學(xué)了容易忘,這里教你一個(gè)方法,那就是重復(fù)學(xué)習(xí)。
打個(gè)比方,假如你正在學(xué)習(xí) spring 注解,突然發(fā)現(xiàn)了一個(gè)注解@Aspect,不知道干什么用的,你可能會(huì)去查看源碼或者通過博客學(xué)習(xí),花了半小時(shí)終于弄懂了,下次又看到@Aspect 了,你有點(diǎn)郁悶了,上次好像在哪哪哪學(xué)習(xí),你快速打開網(wǎng)頁花了五分鐘又學(xué)會(huì)了。
從半小時(shí)和五分鐘的對(duì)比中可以發(fā)現(xiàn)多學(xué)一次就離真正掌握知識(shí)又近了一步。
[外鏈圖片轉(zhuǎn)存中…(img-fORJ2hQF-1649669341343)]
人的本性就是容易遺忘,只有不斷加深印象、重復(fù)學(xué)習(xí)才能真正掌握,所以很多書我都是推薦大家多看幾遍。哪有那么多天才,他只是比你多看了幾遍書。
總結(jié)
以上是生活随笔為你收集整理的【设计模式】职责链模式,MySQL+Tomcat+JVM,看完还怕面试官的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断四个点是否在同一个平面上
- 下一篇: Html页面Js调用android本地相