流行的MVC架构模式如今的Web开发,各种框架风起云涌,势如破竹。从国内排名第一的ThinkPhp,到称霸全球的Laravel,这些框架都有一个共同的特点,它们都采用了MVC架构模型。不出所料,王小二的公司使用Thinkphp开发了公司的旗舰产品。获得新需求某天,小二刚到公司,正打算坐下来喝杯茶。老板走过来:“小二,现在有一个新的需求,我们之前提交订单的模块需要增加发送邮件的功能,你看看能不能实现?”小二想了想说:“没问题,最多三天就可以搞定!”老板看着王小二自信满满的样子,满意的点了点头。让我们开始处理臃肿的控制器吧!小二打开熟悉的IDE,找到提交订单模块的Controller。我的天啊!我不知道我是否不读它。当我看到它时,我感到震惊。这个Controller的代码接近2000行。因为用户提交订单的时候,会和其他模块进行交互,需要的数据也比较复杂。看到这个Controller,Model层的各种数据,然后各种逻辑处理,难怪代码达到了将近2000行。“哎,这2000行代码看着就头疼,可我怎么写呢?”小二叹了口气。“要不要再问问C哥?”MVC的麻烦二哥找到了C哥,详细描述了他的问题。C哥喝了一口水,淡定的说道:“嗯,这个我遇到过。”“你也遇到过,怎么解决的?””这个问题,哈哈,就说它是MVC的麻烦吧!MVC将View和Model分离解耦了,这很好,但是很多人把业务逻辑处理写在Controller里面,这让Controller越来越臃肿,以至于最终无法维持。”“对对对,你说的太对了,我经常这样写。”【图:臃肿的代码】C哥继续为Controller减肥:其实Controller不应该处理太多的业务逻辑,我举两个例子,一个controller,就像一个遥控器,你见过遥控器care吗关于电视是怎么播放视频的?不会的,遥控器只是发送信号播放视频,遥控器并不关心播放视频的具体细节。控制器,就像将军。你见过将军亲自武装吗?每个士兵?详情将军不用问,将军的职责就是带兵打仗。说到这里,小二恍然大悟:“听丙哥的话,胜过读十年书!”“既然如此,还是给Controller减肥吧。C哥说:可以,但是怎么减肥呢?《初识Facade外观模式》给你讲一个设计模式——外观模式,你就懂了”。访问子系统中的一组接口。外观模式定义了一个高层接口,使得子系统更容易访问就是说,在做一个很复杂的事情的时候,你觉得团队里的每个人都要花一年半的时间,你想学这个怎么做吗?使用外观模式,我只需要指定一个人来学会这些复杂的步骤,然后我会告诉界面人去做《Facade外观模式的应用》如果你能实现上面的需求,你可能会找到用户提交订单的Controller,然后写一大堆控制器中的代码。是还是不是?"/****文件名:SubmitController.class.php(用户提交模块控制器)****///......继续...2000行代码。..........////获取用户邮箱publicfunctionget_user_email($uid){returnnewUser()->get_user_email($uid);}//获取要发送给用户的邮箱地址Contentpublicfunctionget_email_content($uid){returnnewEmail()->get_email_content($uid);}//发送邮件publicfunctionsend_email($email,$content){returnnewEmail()->send_email($email,$content);}//用户提交订单触发的方法publicfunctionsubmit(){$email=$this->get_user_email($uid);$content=$this->get_email_content($uid);$this->send_email($email,$content);}“对对对,我就这样写”。“其实你用的ThinkPhp有一层叫Logic层,你可以把业务逻辑处理的部分写在Logic层,这样Controller层就变得很轻量,容易维护。”/****文件name:SendEmailFacadeLogic.class.php(SendEmailLogic)****///获取用户邮箱privatefunctionget_user_email($uid){returnnewUser()->get_user_email($uid);}//获取用户发送内容privatefunctionget_email_content($uid){returnnewEmail()->get_email_content($uid);}//发送邮件publicfunctionsend_email($uid){$email=$this->get_user_email($uid);$content=$this->get_email_content($uid);returnnewEmail()->send_email($email,$content);}/****文件名:SubmitController.class.php(用户提交模块控制器)****///............续...2000行代码............//D('SendEmail','Logic')->send_email($uid);》你看,增加了Logic层,业务逻辑都放在Logic里面处理了,Controller是不是瘦了很多?Logic层为Controller提供了一个高层接口,用来发送邮件,就是Facade模式的应用。”加深理解“小二,你明白了吗?”“是啊,明白了很多,就像开悟一样!”“为了加深大家的理解,我给大家画一张简单的示例图。”“真的吗?太谢谢C哥了。”恍然大悟,看到C哥画的图,小二小车才恍然大悟。“C哥,Facade模式真好,你看,统一成这样一个简单的界面之后:”1.降低了系统的耦合度。提交订单的Controller不再需要和UserController、EmailController等耦合,现在只需要关心SendEmailFacadeLogic即可。2、而且,用户使用Facade模式后,统一入口,便于监控客户对系统的使用情况。就像Thinkphp的单项一样。“是啊。小二真的很聪明,的确如此。”更多精彩,敬请关注公众号《谈代码》,聊聊“左手编码,右手写诗”。
