亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

設(shè)計(jì)模式系列·Facade模式之MVC的煩惱

zhichangterry / 3654人閱讀

摘要:沒(méi)有任何意外,王小二的公司用來(lái)開(kāi)發(fā)公司的主打產(chǎn)品。臃腫的著手開(kāi)干吧小二打開(kāi)熟悉的,找到提交訂單模塊的。要不再去請(qǐng)教下哥的煩惱小二找到哥,詳細(xì)的描述了他的問(wèn)題。

流行的MVC架構(gòu)模式

如今的Web開(kāi)發(fā),各種框架風(fēng)起云涌,勢(shì)如破竹。

從國(guó)民第一的ThinkPhp到稱(chēng)霸全球的Laravel,這些框架有一個(gè)共同特征,都采用了MVC的架構(gòu)模式。

沒(méi)有任何意外,王小二的公司用Thinkphp來(lái)開(kāi)發(fā)公司的主打產(chǎn)品。

Get新需求

一天,小二剛到公司,正打算坐下來(lái)喝杯茶。

老大走了過(guò)來(lái):“小二啊,現(xiàn)在有個(gè)新的需求。咱們之前提交訂單的模塊,需要增加發(fā)送郵件的功能,你看看能不能實(shí)現(xiàn)?”

小二想了想說(shuō):“沒(méi)問(wèn)題,最多3天搞定!”

看王小二胸有成竹的樣子,老大滿(mǎn)意的點(diǎn)了點(diǎn)頭。

臃腫的Controller

著手開(kāi)干吧!小二打開(kāi)熟悉的IDE,找到提交訂單模塊的Controller。

OMG!不看不知道,一看嚇一跳,這個(gè)Controller的代碼竟然接近2000行。

因?yàn)橛脩?hù)提交訂單時(shí),會(huì)與其他模塊進(jìn)行交互,需要的數(shù)據(jù)也比較復(fù)雜。
只見(jiàn)此Controller,從Model層各種拿數(shù)據(jù),然后各種邏輯處理,怪不得代碼到了將近2000行。

“哎,這2000行代碼,看著就頭疼,可讓我怎么寫(xiě)啊”...小二嘆氣道。

“要不再去請(qǐng)教下C哥?”

MVC的煩惱

小二找到C哥,詳細(xì)的描述了他的問(wèn)題。

C哥喝了口水,淡定的說(shuō):“這個(gè)嘛,我之前也遇到過(guò)。”

“您也遇到過(guò),怎么解決的?”

“這個(gè)問(wèn)題,哈哈,姑且就叫MVC的煩惱吧!MVC將View與Model進(jìn)行了分離解耦,這固然很好,但很多人就將業(yè)務(wù)邏輯的處理寫(xiě)在了Controller里,導(dǎo)致Controller越來(lái)越臃腫,以致最后都無(wú)法維護(hù)。”

“對(duì)對(duì)對(duì),您說(shuō)的太對(duì)了,我就經(jīng)常這樣寫(xiě)?!?/p>

[圖片:臃腫的代碼]

給Controller減肥

C哥繼續(xù)說(shuō)道:其實(shí),Controller不應(yīng)該處理過(guò)多的業(yè)務(wù)邏輯。給你舉兩個(gè)例子就明白了。

控制器,就像遙控器一樣。
你見(jiàn)過(guò)遙控器關(guān)心電視怎么播放視頻嗎?沒(méi)有,遙控器只是發(fā)送播放視頻的信號(hào),具體的播放視頻的細(xì)節(jié),遙控器不會(huì)關(guān)心。

控制器,就像將軍一樣。
你見(jiàn)過(guò)將軍親自為每位士兵配備武器嗎?細(xì)節(jié)部分,將軍不必過(guò)問(wèn),將軍的職責(zé)是領(lǐng)兵打仗,這叫各司其職,否則就亂了。

說(shuō)到這里,小二恍然大悟:“聽(tīng)C哥一席話(huà),勝讀十年書(shū)??!”

“既然這樣,就給Controller減減肥吧。”C哥說(shuō)到
“是啊,但是怎么減肥呢?”

初識(shí)Facade外觀模式

“我給你講一種設(shè)計(jì)模式-外觀模式,你就懂了”。
“好啊好啊,洗耳恭聽(tīng)”。

C哥又講到:

外觀模式,提供了統(tǒng)一的接口,用來(lái)訪(fǎng)問(wèn)子系統(tǒng)中的一群接口。外觀模式定義了一個(gè)高層接口,使得子系統(tǒng)更加易用。

也就是說(shuō),干一件很復(fù)雜的事的時(shí)候,你想團(tuán)隊(duì)中每個(gè)人都花一年半載去學(xué)習(xí)如何做這件事嗎?利用外觀模式,我只需要指定一個(gè)人去學(xué)會(huì)這些復(fù)雜的步驟,然后我再告訴這個(gè)接口人去干就行了。

Facade外觀模式的應(yīng)用

“如果讓你實(shí)現(xiàn)上面那個(gè)需求,你可能會(huì)找到用戶(hù)提交訂單的Controller,然后在Controller里寫(xiě)下面一大堆代碼。是不是?”

/****文件名:SubmitController.class.php(用戶(hù)提交模塊controller)****/
    
//..............接上...2000行代碼..............//

    //獲取用戶(hù)郵箱
    public function get_user_email($uid){
        return new User()->get_user_email($uid);
    }
    //獲取要發(fā)送給用戶(hù)的內(nèi)容
    public function get_email_content($uid){
        return new Email()->get_email_content($uid);
    }
    //發(fā)送郵件
    public function send_email($email,$content){
        return new Email()->send_email($email,$content);
    }
    
    //用戶(hù)提交訂單觸發(fā)的方法
    public function submit(){
        $email=$this->get_user_email($uid);
        $content=$this->get_email_content($uid);
        $this->send_email($email,$content);
    }

“對(duì)對(duì)對(duì),我會(huì)這么寫(xiě)”。

"其實(shí)你用的ThinkPhp,有一層叫Logic層,關(guān)于業(yè)務(wù)邏輯處理的部分,你可以寫(xiě)在Logic層里。這樣,Controller層就變得很輕量了,好維護(hù)了。"

/****文件名:SendEmailFacadeLogic.class.php(發(fā)送郵件Logic)****/
    
    //獲取用戶(hù)郵箱
    private function get_user_email($uid){
        return new User()->get_user_email($uid);
    }
    //獲取要發(fā)送給用戶(hù)的內(nèi)容
    private function get_email_content($uid){
        return new Email()->get_email_content($uid);
    }
    //發(fā)送郵件
    public function send_email($uid){
        $email=$this->get_user_email($uid);
        $content=$this->get_email_content($uid);
        return new Email()->send_email($email,$content);
    }
/****文件名:SubmitController.class.php(用戶(hù)提交模塊controller)****/
    
//..............接上...2000行代碼..............//

    D("SendEmail","Logic")->send_email($uid);

“你看,加了Logic層,業(yè)務(wù)邏輯都放在Logic里面去處理,Controller是不是瘦了很多呢?Logic層為Controller提供了一個(gè)高層的接口用來(lái)發(fā)送郵件,也就是Facade模式的應(yīng)用?!?/p> 加深理解

“小二,明白些了吧?”
“嗯嗯,明白了好多,猶如醍醐灌頂!”

“為了加深你的理解,我給你畫(huà)個(gè)簡(jiǎn)單的實(shí)例圖吧”。
“真的嗎?太謝謝C哥了”。

恍然大悟

看了C哥畫(huà)的圖,小二小徹小悟了。

“C哥,F(xiàn)acade模式真不錯(cuò),你看,這樣統(tǒng)一成簡(jiǎn)單的接口后:”

1、降低了系統(tǒng)的耦合度。提交訂單的Controller,再也不用與UserController、EmailController等耦合了。現(xiàn)在只需要關(guān)心SendEmailFacadeLogic就可以了。
2、并且,用戶(hù)使用了Facade模式后,有了統(tǒng)一的入口,就很容易監(jiān)控客戶(hù)對(duì)系統(tǒng)的使用了。就如Thinkphp的單一入口一樣。

“嗯嗯。小二真聰明,確實(shí)是這樣?!?/p>

更多精彩,請(qǐng)關(guān)注公眾號(hào)“聊聊代碼”,讓我們一起聊聊“左手代碼右手詩(shī)”的事兒。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22589.html

相關(guān)文章

  • Java開(kāi)發(fā)

    摘要:大多數(shù)待遇豐厚的開(kāi)發(fā)職位都要求開(kāi)發(fā)者精通多線(xiàn)程技術(shù)并且有豐富的程序開(kāi)發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線(xiàn)程相關(guān)的問(wèn)題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱(chēng)之為序列化,反之將字節(jié)流重建成對(duì)象稱(chēng)之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

    LuDongWei 評(píng)論0 收藏0
  • JS設(shè)計(jì)模式Facade(外觀)模式

    摘要:概念模式為更大的代碼提供了一個(gè)方便的高層次接口,能夠隱藏其底層的真是復(fù)雜性。參考設(shè)計(jì)模式設(shè)計(jì)模式系列文章設(shè)計(jì)模式之模塊模式揭示模塊模式設(shè)計(jì)模式之單例模式設(shè)計(jì)模式之外觀模式 概念 Facade模式為更大的代碼提供了一個(gè)方便的高層次接口,能夠隱藏其底層的真是復(fù)雜性??梢园阉氤墒呛?jiǎn)化API來(lái)展示給其他開(kāi)發(fā)人員。 優(yōu)缺點(diǎn) 優(yōu)點(diǎn) 簡(jiǎn)化接口 使用者與代碼解耦 易于使用 缺點(diǎn) 存在隱性成本,性...

    xiaodao 評(píng)論0 收藏0
  • 理解設(shè)計(jì)模式

    摘要:適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。代理模式為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。如果用來(lái)解決排序問(wèn)題不符合開(kāi)閉原則,添加策略需要修改代碼用策略模式將策略抽象成接口,不同的策略實(shí)現(xiàn)該接口。 簡(jiǎn)單工廠(chǎng)、工廠(chǎng)方法、抽象工廠(chǎng) 簡(jiǎn)單工廠(chǎng) 通過(guò)定義多個(gè)factory.produceXXX()方法,或者通過(guò)向factory.produce(type)傳遞type參數(shù)來(lái)生成...

    saucxs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<