Эта статья взята с pilishen.com----Оригинальная ссылка; Добро пожаловать в нашу группу по изучению php&Laravel: 109256050
Эта статья принадлежит«Основные боевые секреты базовой технологии Laravel»Расширенное чтение главы «Анализ основных концепций laravel» в этом курсе. Принимая во внимание основные различия между студентами, чтобы видео не было слишком подробным и загроможденным, некоторые моменты знаний PHP, связанные с базовой реализацией laravel, представлены в виде статей, которые каждый может просмотреть и просмотреть в любое время.
Перевод слова фасад.
Слово фасад первоначально относилось к поверхности и внешнему виду здания. В архитектуре оно переводится как термин "фасад". Внутреннее внимание к слову фасад может больше зависеть от популярности laravel. Последовательно переводите фасад в laravel как " фасад". Честно говоря, когда я впервые увидел, какой «фасад» упоминается в переведенном документе, я подумал, что мы с вами единодушны: «О чем это? Вы про магазин, фасад магазина?» Пока теперь, если мне приходится использовать слово «фасад» по-китайски, мне приходится использовать слово «фасад», я все еще бессознательно чувствую «скрип» в своем сердце, я знаю, что здесь есть проблема.
Что такое перевод фасада в конце концов? С другой стороны, некоторые люди просто выступают за то, чтобы не переводить, а просто воспринимать английские слова напрямую, когда они встречаются.Это не долгосрочное решение.В конце концов, это должно проложить путь для понимания новичками. Позже я случайно увидел тайваньского ученого, а именно тайваньскую Википедию, который перевел узор фасада как «образец внешнего вида».Учитывая фактический эффект этого узора, я сразу же почувствовал облегчение. Даже если фасад в laravel не является строго шаблоном фасада, многие люди все еще критикуют злоупотребление и введение в заблуждение слова «фасад» в laravel, но в конце концов это заимствование или имитация шаблона фасада, поэтому фасад в laravel, эта статья также Думаю, лучше перевести то же самое, что и "внешний вид", конечно, для лучшего понимания, можно и "служебный вид". Тем не менее, с личной точки зрения, я предпочитаю называть его «Поиск службы», «Агент службы» или «Псевдоним службы». На самом деле, многие люди за границей также предлагают изменить имя таким образом, но отношение Тейлора к этому Материя необыкновенно жесткая, так что форсировать ее пока не нужно.
Благодаря следующему, после того, как вы действительно поймете, что такое узор фасада, я думаю, вы лучше поймете, почему его более уместно переводить как «узор фасада».
Что такое узор фасада (определение «узор фасада»)
Независимо от того, в реальном мире или в мире программирования, цель фасада состоит в том, чтобы «задрапировать» красивую и привлекательную внешность или маску потенциально уродливой и грязной вещи, согласно китайской поговорке: что это за внешний вид? «Люди полагаются на одежду, а лошади полагаются на седла». Исходя из этого, шаблон фасада состоит в том, чтобы добавить (или преобразовать) один или несколько запутанных, сложных и непростых для рефакторинга классов в красивую и элегантную стыковочную запись (интерфейс), чтобы вам было веселее и удобнее. чтобы управлять им, тем самым косвенно управляя фактической логикой, стоящей за ним.
Когда использовать шаблон фасада
- Шаблон фасада («шаблон фасада») часто используется для предоставления унифицированного интерфейса входа или рабочего интерфейса для одной или нескольких подсистем.
- Когда вам нужно управлять проектами, оставленными другими, или сторонним кодом. Особенно часто вам сложно рефакторить код, а тесты не предусмотрены. На этом этапе вы можете создать фасад («фасад»), чтобы «обернуть» исходный код, чтобы упростить или оптимизировать сценарии его использования.
Без лишних слов, вот несколько примеров:
Пример 1: В Java сложная системная информация внутри компьютера управляется через фасад
Предположим, у нас есть некоторая сложная логика подсистемы, подобная этой:
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) {
...
}
}
Чтобы ими было легче манипулировать, мы можем создать фасад:
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();
}
}
Пример 2: Плохой сторонний почтовый класс
Предположим, вам нужно использовать этот сторонний почтовый класс, который выглядит ужасно, тем более, что вам нужно ждать несколько секунд, пока имя каждого метода будет понятно:
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());
}
}
В настоящее время вам нелегко напрямую изменить исходный код. Нет никакого способа. Приходите на фасад.
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();
}
}
Тогда исходный вызов неоптимизированного терминала может выглядеть так:
$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();
Пример 3: Завершение сложного процесса товарной сделки
Предположим, ссылка для торговли сырьевыми товарами должна иметь следующие шаги:
$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();
}
Видно, что процесс состоит из множества шагов и включает в себя множество объектов.Если в нескольких местах используются одинаковые ссылки, это может вызвать проблемы, поэтому сначала можно создать класс внешнего вида:
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();
Пример 4: Процесс синхронизации сообщений с несколькими социальными сетями
// 发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);
}
}
Если каждый раз, когда мы пишем статью и хотим переслать ее на другие платформы, нам придется вызывать соответствующие методы отдельно, что будет слишком много работы, а количество платформ часто будет только увеличиваться на более позднем этапе. На этот раз с помощью класса фасада:
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.');
Преимущества и недостатки фасадного рисунка
Преимущество
Он может отделить вызовы вашего терминала от стоящей за ним логики подсистемы, что часто происходит в вашем контроллере, а это значит, что ваш контроллер может иметь меньше зависимостей, а контроллер уделяет меньше внимания, поэтому ответственности и логики тоже больше. это также означает, что логические изменения в вашей подсистеме не повлияют на терминальные вызовы в вашем контроллере.
недостаток
Хотя это особенно полезно, распространенная ошибка заключается в том, что чрезмерное использование этого режима может не понадобиться в то время, и часто достаточно обратить на него внимание. Конечно, некоторые люди утверждают, что мой оригинальный код можно использовать, зачем заморачиваться, ведь это тоже дом, вам нравится жить в ажурном доме или достаточно иметь четыре стены?
Чувствуете себя знакомым с шаблоном фасада и другими шаблонами дизайна?
внимательно изучите нас«Основные боевые секреты базовой технологии Laravel»Студенты этого курса могут особенно почувствовать, что этот узор на фасаде, кажется, уже видели раньше, когда они приходят сюда? Может быть, вы выпалите: «В чем разница между этим продуктом и шаблоном декоратора, который мы изучали раньше? Почему бы просто не назвать его шаблоном декоратора?»
Действительно, они действительно похожи, когда дело доходит до «обертывания» логики, но:
修饰者模式(Decorator)
—— Используется для добавления и переноса нового поведения и логики в объект без изменения исходного кода.
外观模式(facade pattern)
——Используется для предоставления унифицированной записи для одной или нескольких сложных подсистем или сторонних библиотек или унифицированного метода вызова терминала.
Разница все же есть~