成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 詳解PHP中的外觀模式facade pattern

詳解PHP中的外觀模式facade pattern

熱門標簽:南寧高頻外呼回撥系統(tǒng)哪家好 專業(yè)電話機器人批發(fā)商 離石地圖標注 長沙crm外呼系統(tǒng)業(yè)務 400電話辦理福州市 江蘇外呼電銷機器人報價 電話機器人危險嗎 深圳外呼系統(tǒng)收費 400電話申請方法收費

關于facade這個詞的翻譯

facade這個詞,原意指的是一個建筑物的表面、外觀,在建筑學中被翻譯為“立面”這個術語,國內對facade這個詞的關注,可能更多要依賴于laravel的流行,似乎都一致把laravel里的facade翻譯作“門面”。說實在的,當第一次看到翻譯文檔里提什么“門面”的時候,我想你跟我的內心一樣:“這是在說什么玩意呢?你是在講商店、店鋪的門面嗎?”直到現在,如果非得用中文說facade,非得用“門面”這個詞,我的心里還是不自覺地會“咯噔”那么一下,我知道這里是有問題的。

facade到底翻譯作啥好呢?倒是也有的人群干脆提倡不翻譯,遇到它就直接英文單詞拿過來,這也不是個長遠辦法,終歸是要為了新入門的人鋪平理解的道路才好。后來偶然看到臺灣的學者,確切說是臺灣的維基百科,將facade pattern譯作“外觀模式”,考慮到該模式的實際作用,方才感覺瞬間釋然。即使laravel里的facade,嚴格上并不是facade pattern,很多人到現在依然在批評laravel在facade這個詞語上的濫用和誤導,但它終歸也是在借用或模仿facade pattern,所以laravel里的facade,本文也認為同樣翻譯成“外觀”比較好,當然,為了更好理解,可以是“服務外觀”。即使如此,從私人角度,我更希望將其直呼為“服務定位器”、“服務代理”或者“服務別名”,實際上國外的很多人也是建議如此更名,只是Taylor在這件事上態(tài)度一反往常地強硬,所以也暫且不必強求。

通過下文,待實際了解了facade pattern具體是啥后,我想你會更好地理解為什么翻譯為“外觀模式”更貼切。

什么是facade pattern(“外觀模式”的定義)

不論在現實世界還是編程世界,facade(外觀)的目的就是給一個可能原本丑的、雜亂的東西,“披上”一個優(yōu)美的、吸引人的外觀、或者說面具,用中國的俗話就是:什么是外觀?“人靠衣裝馬靠鞍”?;诖耍琭acade pattern就是將一個或多個雜亂的、復雜的、不容易重構的class,添加上(或轉換成)一個漂亮優(yōu)雅的對接入口(interface),這樣呢好讓你更樂意、更方便地去操作它,從而間接地操作了背后的實際邏輯。

什么時候需要用facade pattern

facade pattern(“外觀模式”)經常是用來給一個或多個子系統(tǒng),來提供統(tǒng)一的入口界面(interface),或者說操作界面。
當你需要操作別人遺留下來的項目,或者說第三方的代碼的時候。尤其是通常情況下,這些代碼你不容易去重構它們,也沒有提供測試(tests)。這個時候,你就可以創(chuàng)建一個facade(“外觀”),去將原來的代碼“包裹”起來,以此來簡化或優(yōu)化其使用場景。

說得再多,不如來幾個例子直觀:

示例一:在java中,通過facade操作計算機內部復雜的系統(tǒng)信息

假設我們有這么一些復雜的子系統(tǒng)邏輯:

class CPU {
 public void freeze() { ... }
 public void jump(long position) { ... }
 public void execute() { ... }
}
class Memory {
 public void load(long position, byte[] data) {
  ...
 }
}
class HardDrive {
 public byte[] read(long lba, int size) {
  ...
 }
}

為了更方便地操作它們,我們可以來創(chuàng)建一個外觀類(facade):

class Computer {
 public void startComputer() {
  cpu.freeze();
  memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
  cpu.jump(BOOT_ADDRESS);
  cpu.execute();
 }
}

然后我們的客戶,就可以很方便地來這樣調用了:

class You {
 public static void main(String[] args) {
  Computer facade = new Computer();
  facade.startComputer();
 }
}

示例二:一個糟糕的第三方郵件類

假設你不得不用下面這個看上去很糟糕的第三方郵件類,尤其是里面每個方法名你都得停留個好幾秒才能看懂:

interface SendMailInterface
{
 public function setSendToEmailAddress($emailAddress);
 public function setSubjectName($subject);
 public function setTheEmailContents($body);
 public function setTheHeaders($headers);
 public function getTheHeaders();
 public function getTheHeadersText();
 public function sendTheEmailNow();
}
class SendMail implements SendMailInterface
{
 public $to, $subject, $body;
 public $headers = array();
 
 public function setSendToEmailAddress($emailAddress)
 {
  $this->to = $emailAddress;
 }
 public function setSubjectName($subject)
 {
  $this->subject = $subject;
 }
 public function setTheEmailContents($body)
 {
  $this->body = $body;
 }
 public function setTheHeaders($headers)
 {
  $this->headers = $headers;
 }
 public function getTheHeaders()
 {
  return $this->headers;
 }
 public function getTheHeadersText()
 {
  $headers = "";
  foreach ($this->getTheHeaders() as $header) {
   $headers .= $header . "\r\n";
  }
 }
 
 public function sendTheEmailNow()
 {
  mail($this->to, $this->subject, $this->body, $this->getTheHeadersText());
 }
}

這個時候你又不好直接改源碼,沒辦法,來一個facade吧

class SendMailFacade
{
 private $sendMail;
 public function __construct(SendMailInterface $sendMail)
 {
  $this->sendMail = $sendMail;
 }
 public function setTo($to)
 {
  $this->sendMail->setSendToEmailAddress($to);
  return $this;
 }
 public function setSubject($subject)
 {
  $this->sendMail->setSubjectName($subject);
  return $this;
 }
 public function setBody($body)
 {
  $this->sendMail->setTheEmailContents($body);
  return $this;
 }
 public function setHeaders($headers)
 {
  $this->sendMail->setTheHeaders($headers);
  return $this;
 }
 public function send()
 {
  $this->sendMail->sendTheEmailNow();
 }
}
 

然后原來不加優(yōu)化的終端調用可能是這樣的:

$sendMail = new SendMail();
$sendMail->setSendToEmailAddress($to);
$sendMail->setSubjectName($subject);
$sendMail->setTheEmailContents($body);
$sendMail->setTheHeaders($headers);
$sendMail->sendTheEmailNow();

現在有了外觀類,就可以這樣了:

$sendMail  = new SendMail();
$sendMailFacade = new sendMailFacade($sendMail);
$sendMailFacade->setTo($to)->setSubject($subject)->setBody($body)->setHeaders($headers)->send();

示例三:完成一個商品交易的復雜流程

假設呢,一個商品交易環(huán)節(jié)需要有這么幾步:

$productID = $_GET['productId']; 
$qtyCheck = new productQty();

 // 檢查庫存
if($qtyCheck->checkQty($productID) > 0) {
  
 // 添加商品到購物車
 $addToCart = new addToCart($productID);
  
 // 計算運費
 $shipping = new shippingCharge();
 $shipping->updateCharge();
  
 // 計算打折
 $discount = new discount();
 $discount->applyDiscount();
  
 $order = new order();
 $order->generateOrder();
}

可以看到,一個流程呢包含了很多步驟,涉及到了很多Object,一旦類似環(huán)節(jié)要用在多個地方,可能就會導致問題,所以可以先創(chuàng)建一個外觀類:

class productOrderFacade {
 public $productID = '';  
 public function __construct($pID) {
  $this->productID = $pID;
 }
 public function generateOrder() {   
  if($this->qtyCheck()) {
   $this->addToCart();
   $this->calulateShipping();
   $this->applyDiscount();
   $this->placeOrder();
  }   
 }
 private function addToCart () {
  /* .. add product to cart .. */
 } 
 private function qtyCheck() {
  $qty = 'get product quantity from database';
  if($qty > 0) {
   return true;
  } else {
   return true;
  }
 }
  private function calulateShipping() {
  $shipping = new shippingCharge();
  $shipping->calculateCharge();
 }
 private function applyDiscount() {
  $discount = new discount();
  $discount->applyDiscount();
 }
 private function placeOrder() {
  $order = new order();
  $order->generateOrder();
 }
}

這樣呢,我們的終端調用就可以兩行解決:

$order = new productOrderFacade($productID);
$order->generateOrder();

示例四:往多個社交媒體同步消息的流程

// 發(fā)Twitter消息
class CodeTwit {
 function tweet($status, $url)
 {
 var_dump('Tweeted:'.$status.' from:'.$url);
 }
}
// 分享到Google plus上
class Googlize {
 function share($url)
 {
 var_dump('Shared on Google plus:'.$url);
 }
}
//分享到Reddit上
class Reddiator {
 function reddit($url, $title)
 {
 var_dump('Reddit! url:'.$url.' title:'.$title);
 }
}

如果每次我們寫了一篇文章,想著轉發(fā)到其他平臺,都得分別去調用相應方法,這工作量就太大了,后期平臺數量往往只增不減呢。這個時候借助于facade class:

class shareFacade {
 
 protected $twitter; 
 protected $google; 
 protected $reddit; 
 function __construct($twitterObj,$gooleObj,$redditObj)
 {
 $this->twitter = $twitterObj;
 $this->google = $gooleObj;
 $this->reddit = $redditObj;
 } 
 function share($url,$title,$status)
 {
 $this->twitter->tweet($status, $url);
 $this->google->share($url);
 $this->reddit->reddit($url, $title);
 }
}

這樣終端調用就可以:

$shareObj = new shareFacade($twitterObj,$gooleObj,$redditObj);
$shareObj->share('//myBlog.com/post-awsome','My greatest post','Read my greatest post ever.');

facade pattern的優(yōu)劣勢

優(yōu)勢

能夠使你的終端調用與背后的子系統(tǒng)邏輯解耦,這往往發(fā)生在你的controller里,就意味著你的controller可以有更少的依賴,controller關注的更少了,從而責任和邏輯也更明確了,同時也意味著你子系統(tǒng)里的邏輯更改,并不會影響到你的controller里終端調用。

劣勢

雖然特別有用,但是一個常見的陷阱就是,過度使用這個模式,明明可能那個時候你并不需要,這個往往注意即可。當然也有人爭論說,明明我原來的代碼都能用,干嘛費這個勁,那么同樣是房子,你是喜歡住在精致的屋子里呢,還是說有四面墻就行了呢?

感覺facade pattern與其他的設計模式似曾相識?

認真學過我們《Laravel底層核心技術實戰(zhàn)揭秘》這一課程的同學,可能到這里就會尤其覺得這個facade pattern好像在哪里見過?可能你會脫口而出:“這貨跟之前咱們學的decorator pattern有啥區(qū)別呢?為啥不直接說成修飾者模式呢?”

確實,在“包裝”邏輯方面,它們確實類似,但是:

修飾者模式(Decorator)——用來給一個Object添加、包裹上新的行為、邏輯,而不需要改動原來的代碼

外觀模式(facade pattern)——用來給一個或多個復雜的子系統(tǒng)、或者第三方庫,提供統(tǒng)一的入口,或者說統(tǒng)一的終端調用方式

還是有一定差別的~

您可能感興趣的文章:
  • PHP設計模式(九)外觀模式Facade實例詳解【結構型】
  • PHP設計模式之外觀模式(Facade)入門與應用詳解
  • thinkphp5.1框架中容器(Container)和門面(Facade)的實現方法分析
  • 學習php設計模式 php實現門面模式(Facade)
  • php設計模式 Facade(外觀模式)
  • PHP設計模式之PHP迭代器模式講解
  • PHP設計模式之工廠模式(Factory Pattern)的講解
  • 淺談PHP設計模式之門面模式Facade

標簽:興安盟 白酒營銷 曲靖 株洲 南昌 濱州 南京 太原

巨人網絡通訊聲明:本文標題《詳解PHP中的外觀模式facade pattern》,本文關鍵詞  詳解,PHP,中的,外觀,模式,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解PHP中的外觀模式facade pattern》相關的同類信息!
  • 本頁收集關于詳解PHP中的外觀模式facade pattern的相關信息資訊供網民參考!
  • 推薦文章
    狠狠人妻久久久久久综合蜜桃| 国产欧美久久久久久| 天天操天天摸天天干| 中文在线字幕免费观看| 亚洲国产古装精品网站| 污污软件在线观看| 色婷婷亚洲mv天堂mv在影片| 18av在线播放| 97色伦图片97综合影院| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产精品美女www爽爽爽视频| 妖精视频在线观看免费| 丁香婷婷自拍| 国产精品久久久免费观看| 国产三级按摩推拿按摩| 欧美一区二区三区在线播放| 亚洲欧美韩国综合色| 黑人狂躁日本娇小| 欧美精品一区二区三区国产精品| 免费国产在线视频| 成年人免费观看视频网站| 国产成人激情视频| 在线中文字幕一区二区| 国产精品自拍视频| 国产高清不卡二三区| 欧美国产激情一区二区三区蜜月| 狠狠人妻久久久久久| 韩国女同性做爰三级| 91精品成人久久| 日韩av影院在线观看| 午夜黄色一级片| 国产成人精品一区二区三区在线观看| 精品日本一区二区三区| 久久国产精品免费一区二区三区| 亚洲精品成人三区| 99久久综合狠狠综合久久aⅴ| 97av视频在线| 欧美特黄级在线| 成人在线黄色电影| 国产69精品久久久久9| 免费福利电影| 欧洲一区在线电影| av综合网页| 国产精品对白刺激| 一级视频在线观看| 日本少妇高潮喷水xxxxxxx| www.黄在线观看| 国产乱子伦农村叉叉叉| 一本色道久久综合亚洲aⅴ蜜桃| av激情久久| 国产麻豆精品95视频| 国产精品玖玖玖| 欧美国产日韩免费| 欧美特大特白屁股xxxx| 日本中文字幕视频一区| 狠狠色丁香婷婷综合影院| 精品国产自在精品国产浪潮| 在线观看亚洲| 国产成人午夜精品| 欧美日韩黄色网| 国产亚洲精品美女久久久m| 特级西西444www大精品视频| 九色91av视频| 久久精品一区二区三区不卡牛牛| 精品亚洲一区二区三区四区五区高| 日韩欧美中文在线视频| 亚洲欧美日韩一区二区三区在线| 在线观看美女网站大全免费| 久久国产精品久久久久| free性欧美1819hd| 国产精品露脸自拍| 黄页网站在线观看免费| 欧洲天堂在线观看| 午夜一区二区视频| 国产精品自拍合集| 亚洲无线码在线一区观看| 中文幕无线码中文字蜜桃| 久久综合偷偷噜噜噜色| 欧美日韩久久精品| 亚洲天堂av老司机| fc2ppv国产精品久久| 国产视频网站一区二区三区| 99精品久久久久久中文字幕| 欧美日韩一区不卡| 亚洲iv一区二区三区| 亚洲精品理论电影| 国产大学生校花援交在线播放| www在线观看播放免费视频日本| 欧美一级高潮片| 综合伊人久久| 精品免费视频.| 亚洲aⅴ男人的天堂在线观看| 国产免费一区二区三区最新不卡| 国产欧美一区二区三区小说| av影院在线免费观看| 久久av日韩| 国产成人精品无码片区在线| 午夜激情福利在线| 国产乱淫av一区二区三区| www.亚洲欧美| 国产精品一区二区日韩| 精品视频日韩| 欧美一级免费播放| 日本精品一区二区三区在线观看视频| 成人欧美精品一区二区| 四虎成年永久免费网站| 国产嫩bbwbbw高潮| 日韩视频免费| 欧美成人三级| 亚洲精品乱码久久久久久按摩观| 亚洲日本在线看| 男人的天堂久久| 最近免费中文字幕中文高清百度| 91九色综合久久| 免费看一区二区三区| 亚洲制服欧美中文字幕中文字幕| 精品成在人线av无码免费看| 日本成熟性欧美| 三上悠亚激情av一区二区三区| 日本不良网站在线观看| 四虎4hu新地址入口2023| 国产片在线观看| 四虎在线视频| 色国产在线视频| 竹内纱里奈兽皇系列在线观看| 视频在线观看免费影院欧美meiju| 91在线观看免费网站| 亚洲成**性毛茸茸| 一区二区三区观看| 欧美人与性动xxxx| 四虎国产精品成人永久免费影视| 国产精久久久久久| 日本成人在线免费观看| 欧美在线欧美在线| 亚洲人视频在线观看| 亚洲精品中文字幕有码专区| 噼里啪啦在线中文观看| 韩国福利在线| 成人性生交大合| 欧美影片第一页| 国产精品青草综合久久久久99| 国产交换配乱淫视频免费| 色噜噜狠狠色综合中国| 97碰碰视频| 黑吊大战白xxxxxx| 日本丰满www色| 视频一区在线| 国产一区二区在线免费观看| 欧美v国产在线一区二区三区| 欧美精品色婷婷五月综合| 亚洲三级免费电影| 岳乳丰满一区二区三区| 久久综合在线观看| 欧美日韩在线精品成人综合网| 7777女厕盗摄久久久| 国产日韩一区二区三区在线| 51精品视频| 欧美日韩国产综合视频| 神马久久精品综合| 蜜臀av一区二区三区有限公司| 国产精品爽爽爽| 久久国产66| 影音先锋男人在线| 国产美女在线观看| 色婷婷亚洲mv天堂mv在影片| 日韩成人一区| 成年人国产在线观看| 91天堂在线观看| 亚洲欧洲国产精品| 国产精美视频| 免费黄频在线观看| 国产日韩视频在线观看| 亚洲同性gay激情无套| 日本亚洲导航| 亚洲永久无码7777kkk| 91丝袜超薄交口足| 久久一区免费| 51av在线| 欧美成a人片免费观看久久五月天| 亚洲国产精品久久人人爱潘金莲| 国产精品福利在线观看网址| 日本私人网站在线观看| 综合一区中文字幕| 国产午夜精品无码| 欧美一区久久久| 日韩精品国产精品| 欧美亚洲视频一区| 中文字幕欧美日韩va免费视频| 午夜日韩福利| 午夜影院在线免费观看| 女人黄色免费在线观看| 国语自产精品视频在线看抢先版结局| 中文字幕1区2区| 亚洲男同性恋视频| 2021中文字幕一区亚洲| 日韩精品诱惑一区?区三区| 国产日韩在线观看视频| 中文在线观看免费高清| 二区视频在线| 亚洲性xxxx| 国产精品成人国产乱| 日韩av在线免费播放| www.精品久久| 国产97在线观看| 亚洲国产一区二区a毛片| 比比资源-先锋影音资源站| 久久99精品国产麻豆婷婷| 日产精品一区| 欧美亚洲色综久久精品国产| 久久五月精品| 国产乱人乱偷精品视频a人人澡| 好吊色一区二区三区| 精品一性一色一乱农村| 国产美女在线精品| 青青a在线精品免费观看| 国产夫妻性生活视频| 老头老太做爰xxx视频| 国产人妻人伦精品1国产丝袜| 91成年人视频| 亚洲国产精品久久久| 久久的精品视频| 黑人操亚洲人| 亚洲欧美中文字幕在线观看| 中日韩免费视频中文字幕| 日韩经典中文字幕在线观看| 伊是香蕉大人久久| 欧洲乱码伦视频免费| 国产午夜精品全部视频在线播放| 邻居大乳一区二区三区| 久久精品国产亚洲av高清色欲| 痴汉一区二区三区| 久草在线资源网站| 国产一区二区三区免费不卡| 日本边添边摸边做边爱的第三级| 在线丨暗呦小u女国产精品| 午夜久久久久久久| 蜜桃网站成人| 国产一区二区三区精品在线| 9.1成人看片| 99国产在线播放| 欧美日韩亚洲高清一区二区| 999久久久| 肉色超薄丝袜脚交| 日韩成人免费在线| 欧美国产在线一区| 欧美黄色一区二区三区| 欧美国产日韩亚洲一区| 中文字幕av一区二区三区四区| 欧美激情videos| 欧美视频一区二区三区四区| 蜜桃传媒一区二区亚洲| 一区视频在线看| 在线播放黄色网址| 日本欧美肥老太交大片| 欧美一级视频免费在线观看| 日韩不卡一区二区三区| 依依成人综合网| 天堂网.www在线资源| 电影在线高清| 国产精品一区二区在线观看网站| 黄色三级视频在线| 日韩成人网免费视频| 欧美jizzhd欧美| 成人黄色网址| 日本公妇乱淫免费视频一区三区| 91色婷婷久久久久合中文| 国产在线视频在线观看| 性欧美18xxxhd| 欧美午夜精品理论片| 操女生的网站| 亚洲欧美一区二区三区久本道91| 亚洲911精品成人18网站| 久久av在线看| 国产福利电影在线观看| 中文字幕一区二区三区在线不卡| 国产精品日本一区二区三区在线| 粉嫩绯色av一区二区在线观看| 亚洲免费在线播放视频| 我不卡神马影院| 国产大学生视频| 国产va免费精品高清在线观看| 日韩精品在线视频观看| 亚洲成年网站在线观看| 国产小视频福利在线| 亚洲资源在线播放| 欧美精品性生活| 岛国片av在线| 青青青国产在线观看| 久久久精品一区二区三区| 搡老岳熟女国产熟妇| 综合国产在线观看| 1区2区在线| 黄网站app在线观看下载视频大全官网| 亚洲一区精品视频在线观看| 久久久无码精品亚洲国产| 一个人看免费www视频有多爽| 欧美激情在线狂野欧美精品| 亚洲在线黄色| 精品人伦一区二区三区蜜桃网站| 老司机免费视频一区二区三区| 91久久国产综合久久91猫猫| 日本精品人妻无码77777| 污污视频在线免费观看| 日韩欧美成人一区| 尤物在线观看一区| 99国内精品久久久久久久软件| 亚洲国产一二三| 日韩免费在线免费观看| 国产精品**亚洲精品| 视频三区二区一区| 国产精品揄拍100视频| 国产精品99999| 给我免费观看片在线电影的| 成人乱码手机视频| 影音先锋在线资源中文字幕| 成人黄色国产精品网站大全在线免费观看| 香蕉视频在线网站| 日韩少妇内射免费播放| 精品国产美女福利到在线不卡| 欧美日韩精品免费观看视欧美高清免费大片| 国产精品高潮呻吟久久久久| 日本午夜免费福利视频| 国产一区二区免费电影| 91av国产在线| 亚洲va码欧洲m码| 污的视频网站| 中文字幕免费精品一区高清| 又色又爽又高潮免费视频国产|