Предвиђено време читања: 6 минута
Образац дизајна није код који можемо да копирамо и убацимо у наш програм, као што то можемо да урадимо са стандардним функцијама или библиотекама. Образац дизајна је општи концепт који може да реши одређени проблем. У основи модел чије детаље можемо пратити и имплементирати решење које одговара реалности нашег програма.
Модели се често мешају са алгоритмима, јер оба концепта описују типична решења неких познатих проблема. Док је алгоритам defiАко увек постоји јасан скуп акција којима се може постићи одређени циљ, модел је опис решења вишег нивоа. Код из истог модела примењен на два различита програма може бити различит.
Желећи да направимо аналогију, можемо смислити рецепт за кување: оба имају јасне кораке за постизање циља. Међутим, модел више личи на пројекат чији се резултат и карактеристике могу видети, али тачан редослед имплементације зависи од нас који пишемо код.
Већина образаца је описана веома формално тако да људи могу да их репродукују у многим контекстима. Погледајмо у наставку елементе који су присутни у опису модела:
Програмер може развити софтвер без знања о постојању образаца дизајна. Многи то раде и из тог разлога спроводе неке шеме а да то не знају. Али зашто бисмо онда трошили време на њихово учење?
Дизајнерски обрасци се разликују по сложености, нивоу детаља и скали применљивости кроз пројектовани систем.
По аналогији, раскрсницу можемо учинити безбеднијом тако што ћемо поставити неколико семафора или изградити читаву вишеслојну петљу са подземним пролазима за пешаке.
Често се називају најосновнији модели ниског нивоа идиоми . Обично се примењују само на један програмски језик.
Најуниверзалнији и врхунски модели су архитектонски модели . Програмери могу имплементирати ове обрасце на практично било који језик. За разлику од других образаца, они се могу користити за дизајнирање архитектуре целе апликације.
Штавише, сви модели се могу класификовати према њиховој Покушали или сврха. Три главне класе су:
Фацаде је структурални образац дизајна који обезбеђује поједностављени интерфејс за библиотеку, оквир или било који други сложен скуп класа.
Претпоставимо да треба да учинимо да софтвер функционише на основу великог скупа објеката који припадају софистицираној библиотеци или оквиру. Обично бисмо морали да иницијализујемо све ове објекте, да пратимо зависности, извршимо методе у исправном редоследу, итд.
Као резултат тога, пословна логика класа би постала тесно повезана са детаљима имплементације класа трећих страна, што би их чинило тешким за разумевање и управљање.
А facade
је класа која пружа једноставан интерфејс за сложени подсистем који садржи много покретних делова. А facade
може пружити ограничену функционалност у поређењу са директним радом са подсистемом. Међутим, укључује само оне карактеристике до којих је купцима заиста стало.
Има један facade
корисно је када треба да интегришемо апликацију са софистицираном библиотеком која има десетине функција, али нам је потребан само мали део њене функционалности.
На пример, апликација која поставља кратке смешне видео записе са мачкама на друштвене мреже потенцијално би могла да користи професионалну библиотеку за конверзију видео записа. Међутим, све што нам је заиста потребно је класа са једним методом encode(filename, format)
. Након што креирамо такву класу и повежемо је са библиотеком за конверзију видео записа, имаћемо прву facade
.
На пример, телефонски оператер кол центра је као а facade
. У ствари, када позовемо телефонску службу продавнице да наручимо телефоном, оператер је наш facade
према свим службама и одељењима продавнице. Оператер обезбеђује једноставан гласовни интерфејс за систем наручивања, платне пролазе и разне услуге доставе.
Размисли о Фацаде као једноставан адаптер за неке сложене подсистеме. Facade
изолује сложеност унутар једне класе и дозвољава другом коду апликације да користи једноставан интерфејс.
У овом примеру, Facade
сакрива сложеност ИоуТубе АПИ-ја и ФФмпег библиотеке од клијентског кода. Уместо да ради са десетинама класа, клијент користи једноставну методу на Фацаде.
<?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
Цовеваре од Вееам-а ће наставити да пружа услуге одговора на инциденте са сајбер изнудом. Цовеваре ће понудити форензику и могућности санације…
Предиктивно одржавање револуционише сектор нафте и гаса, са иновативним и проактивним приступом управљању постројењима.…
УК ЦМА је издао упозорење о понашању Биг Тецх-а на тржишту вештачке интелигенције. Тамо…
Уредба „Цасе Греен“, коју је формулисала Европска унија за побољшање енергетске ефикасности зграда, завршила је свој законодавни процес са…