Проценето време за читање: 6 минути
Дизајнерскиот шаблон не е код што можеме да го копираме и вметнеме во нашата програма, како што можеме да направиме со стандардните функции или библиотеки. Дизајнерскиот шаблон е општ концепт способен да реши одреден проблем. Во основа модел чии детали можеме да ги следиме и да имплементираме решение кое одговара на реалноста на нашата програма.
Моделите често се мешаат со алгоритми, бидејќи и двата концепта опишуваат типични решенија за некои познати проблеми. Додека еден алгоритам defiАко секогаш постои јасен сет на акции со кои може да се постигне одредена цел, моделот е опис на решението од повисоко ниво. Кодот од истиот модел применет на две различни програми може да биде различен.
Сакајќи да направиме аналогија, можеме да смислиме рецепт за готвење: и двете имаат јасни чекори за постигнување на целта. Сепак, моделот е повеќе како проект, од кој можете да видите каков е резултатот и неговите карактеристики, но точниот редослед на имплементација зависи од нас кои го пишуваме кодот.
Повеќето модели се опишани многу формално, така што луѓето можат да ги репродуцираат во многу контексти. Да ги видиме подолу елементите што се присутни во описот на моделот:
Програмер може да развие софтвер без да знае за постоењето на модели на дизајн. Многумина го прават тоа, и поради оваа причина спроведуваат некои шеми без да го знаат тоа. Но, тогаш зошто треба да трошиме време за да ги научиме?
Дизајнерските шеми се разликуваат по сложеност, ниво на детали и обем на применливост низ дизајнираниот систем.
По аналогија, можеме да ја направиме раскрсницата побезбедна со инсталирање на неколку семафори или изградба на цела клучка на повеќе нивоа со подземни премини за пешаци.
Најчесто се нарекуваат најосновните модели на ниско ниво идиоми . Тие обично се однесуваат само на еден програмски јазик.
Најуниверзални и модели на високо ниво се архитектонски модели . Програмерите можат да ги имплементираат овие обрасци на буквално секој јазик. За разлика од другите обрасци, тие можат да се користат за дизајнирање на архитектурата на цела апликација.
Понатаму, сите модели можат да се класифицираат според нивната се обиде или цел. Трите главни класи се:
Фасада е структурен дизајн шема кој обезбедува поедноставен интерфејс за библиотека, рамка или кој било друг комплексен сет на класи.
Да претпоставиме дека треба да направиме софтвер да работи, врз основа на голем сет на објекти кои припаѓаат на софистицирана библиотека или рамка. Нормално, ќе треба да ги иницијализираме сите овие објекти, да ги следиме зависностите, да ги извршуваме методите во правилен редослед итн.
Како резултат на тоа, деловната логика на класите ќе стане цврсто поврзана со деталите за имплементацијата на класите од трети страни, што ќе го отежне нивното разбирање и управување.
на facade
е класа која обезбедува едноставен интерфејс за сложен потсистем кој содржи многу подвижни делови. А facade
може да обезбеди ограничена функционалност во споредба со директното работење со потсистемот. Сепак, тој ги вклучува само карактеристиките за кои клиентите навистина се грижат.
Имајте еден facade
корисно е кога треба да ја интегрираме апликацијата со софистицирана библиотека која има десетици функции, но ни треба само мал дел од нејзината функционалност.
На пример, апликација која поставува кратки смешни видеа со мачки на социјалните медиуми може потенцијално да користи професионална библиотека за конверзија на видео. Сепак, сè што навистина ни треба е класа со единствениот метод encode(filename, format)
. Откако ќе создадеме таква класа и ќе ја поврземе со библиотеката за конверзија на видео, ќе ја имаме нашата прва facade
.
На пример, телефонскиот оператор на телефонски центар е како facade
. Всушност, кога ќе се јавиме во телефонската служба на продавницата за да направиме телефонска нарачка, оператор е наш facade
кон сите сервиси и одделенија на продавницата. Операторот обезбедува едноставен гласовен интерфејс до системот за нарачки, портали за плаќање и разни услуги за испорака.
Размислете за Фасада како едноставен адаптер за некои сложени потсистеми. Facade
ја изолира сложеноста во рамките на една класа и дозволува други апликациски кодови да го користат едноставниот интерфејс.
Во овој пример, Facade
ја крие сложеноста на YouTube API и библиотеката FFmpeg од кодот на клиентот. Наместо да работи со десетици класи, клиентот користи едноставен метод на Фасада.
<?php
namespace RefactoringGuru\Facade\RealWorld;
/**
* The Facade provides a single method for downloading videos from YouTube. This
* method hides all the complexity of the PHP network layer, YouTube API and the
* video conversion library (FFmpeg).
*/
class YouTubeDownloader
{
protected $youtube;
protected $ffmpeg;
/**
* It is handy when the Facade can manage the lifecycle of the subsystem it
* uses.
*/
public function __construct(string $youtubeApiKey)
{
$this->youtube = new YouTube($youtubeApiKey);
$this->ffmpeg = new FFMpeg();
}
/**
* The Facade provides a simple method for downloading video and encoding it
* to a target format (for the sake of simplicity, the real-world code is
* commented-out).
*/
public function downloadVideo(string $url): void
{
echo "Fetching video metadata from youtube...\n";
// $title = $this->youtube->fetchVideo($url)->getTitle();
echo "Saving video file to a temporary file...\n";
// $this->youtube->saveAs($url, "video.mpg");
echo "Processing source video...\n";
// $video = $this->ffmpeg->open('video.mpg');
echo "Normalizing and resizing the video to smaller dimensions...\n";
// $video
// ->filters()
// ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
// ->synchronize();
echo "Capturing preview image...\n";
// $video
// ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
// ->save($title . 'frame.jpg');
echo "Saving video in target formats...\n";
// $video
// ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
// ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
// ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
echo "Done!\n";
}
}
/**
* The YouTube API subsystem.
*/
class YouTube
{
public function fetchVideo(): string { /* ... */ }
public function saveAs(string $path): void { /* ... */ }
// ...more methods and classes...
}
/**
* The FFmpeg subsystem (a complex video/audio conversion library).
*/
class FFMpeg
{
public static function create(): FFMpeg { /* ... */ }
public function open(string $video): void { /* ... */ }
// ...more methods and classes... RU: ...дополнительные методы и классы...
}
class FFMpegVideo
{
public function filters(): self { /* ... */ }
public function resize(): self { /* ... */ }
public function synchronize(): self { /* ... */ }
public function frame(): self { /* ... */ }
public function save(string $path): self { /* ... */ }
// ...more methods and classes... RU: ...дополнительные методы и классы...
}
/**
* The client code does not depend on any subsystem's classes. Any changes
* inside the subsystem's code won't affect the client code. You will only need
* to update the Facade.
*/
function clientCode(YouTubeDownloader $facade)
{
// ...
$facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");
// ...
}
$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);
Ercole Palmeri
Coveware од Veeam ќе продолжи да обезбедува услуги за одговор на инциденти на сајбер изнуда. Coveware ќе понуди форензика и способности за санација…
Предвидливото одржување го револуционизира секторот за нафта и гас, со иновативен и проактивен пристап кон управувањето со постројките.…
Обединетото Кралство CMA издаде предупредување за однесувањето на Big Tech на пазарот на вештачка интелигенција. Таму…
Уредбата за „Case Green“, формулирана од Европската унија за подобрување на енергетската ефикасност на зградите, го заврши својот законодавен процес со…