Разліковы час чытання: 6 хвілін
Шаблон праектавання - гэта не код, які мы можам скапіяваць і ўставіць у нашу праграму, як мы можам зрабіць са стандартнымі функцыямі або бібліятэкамі. Шаблон праектавання - гэта агульная канцэпцыя, здольная вырашыць пэўную задачу. У асноўным мадэль, дэталі якой мы можам прытрымлівацца і рэалізаваць рашэнне, якое адпавядае рэальнасці нашай праграмы.
Мадэлі часта блытаюць з алгарытмамі, таму што абедзве канцэпцыі апісваюць тыповыя рашэнні некаторых вядомых праблем. Пакуль алгарытм defiКалі заўсёды ёсць дакладны набор дзеянняў, якія могуць дасягнуць пэўнай мэты, мадэль - гэта апісанне рашэння больш высокага ўзроўню. Код адной мадэлі, ужыты да дзвюх розных праграм, можа адрознівацца.
Жадаючы правесці аналогію, можна ўспомніць рэцэпт прыгатавання: у абодвух ёсць дакладныя крокі да дасягнення мэты. Аднак мадэль больш падобная на праект, вынік і характарыстыкі якога можна ўбачыць, але дакладны парадак рэалізацыі залежыць ад нас, хто піша код.
Большасць шаблонаў апісаны вельмі фармальна, каб людзі маглі прайграць іх у розных кантэкстах. Давайце паглядзім ніжэй элементы, якія прысутнічаюць у апісанні мадэлі:
Праграміст можа распрацоўваць праграмнае забеспячэнне, не ведаючы пра існаванне шаблонаў праектавання. Многія так і робяць, і таму самі таго не ведаючы рэалізуюць нейкія схемы. Але чаму тады мы павінны марнаваць час на іх вывучэнне?
Патэрны праектавання адрозніваюцца складанасцю, узроўнем дэталізацыі і маштабам дастасавальнасці ў распрацаванай сістэме.
Па аналогіі можна зрабіць скрыжаванне больш бяспечным, усталяваўшы некалькі святлафораў або пабудаваўшы цэлую шматузроўневую развязку з падземнымі пераходамі для пешаходаў.
Самымі базавымі часта называюць нізкаўзроўневыя мадэлі ідыёмы . Звычайна яны прымяняюцца толькі да адной мовы праграмавання.
Найбольш універсальнымі і высокага ўзроўню з'яўляюцца мадэлі архітэктурныя мадэлі . Распрацоўшчыкі могуць рэалізаваць гэтыя шаблоны практычна на любой мове. У адрозненне ад іншых шаблонаў, іх можна выкарыстоўваць для распрацоўкі архітэктуры ўсяго прыкладання.
Акрамя таго, усе мадэлі можна класіфікаваць па іх паспрабаваў або мэта. Тры асноўныя класы:
Фасад гэта структурны шаблон праектавання, які забяспечвае спрошчаны інтэрфейс для бібліятэкі, структуры або любога іншага складанага набору класаў.
Давайце выкажам здагадку, што нам трэба прымусіць праграмнае забеспячэнне працаваць на аснове вялікага набору аб'ектаў, якія належаць складанай бібліятэцы або фрэймворку. Звычайна нам трэба будзе ініцыялізаваць усе гэтыя аб'екты, сачыць за залежнасцямі, выконваць метады ў правільным парадку і гэтак далей.
У выніку бізнес-логіка класаў будзе цесна звязана з дэталямі рэалізацыі класаў іншых вытворцаў, што робіць іх цяжкімі для разумення і кіравання.
Una facade
гэта клас, які забяспечвае просты інтэрфейс для складанай падсістэмы, якая змяшчае мноства рухомых частак. А facade
можа забяспечваць абмежаваную функцыянальнасць у параўнанні з непасрэднай працай з падсістэмай. Аднак ён уключае толькі тыя функцыі, якія сапраўды важныя для кліентаў.
Ёсць адзін facade
гэта карысна, калі нам трэба інтэграваць прыкладанне са складанай бібліятэкай, якая мае дзесяткі функцый, але нам патрэбна толькі невялікая частка яго функцыянальнасці.
Напрыклад, праграма, якая загружае ў сацыяльныя сеткі кароткія смешныя відэаролікі з выявай катоў, патэнцыйна можа выкарыстоўваць прафесійную бібліятэку пераўтварэння відэа. Аднак усё, што нам сапраўды трэба, гэта клас з адзіным метадам encode(filename, format)
. Пасля стварэння такога класа і падключэння яго да бібліятэкі пераўтварэння відэа ў нас будзе наш першы facade
.
Напрыклад, тэлефаніст колл-цэнтра падобны на а facade
. Фактычна, калі мы тэлефануем у тэлефонную службу крамы, каб зрабіць заказ па тэлефоне, аператар - гэта наш facade
да ўсіх службаў і аддзелаў крамы. Аператар прадастаўляе просты галасавы інтэрфейс для сістэмы заказаў, плацежных шлюзаў і розных службаў дастаўкі.
Думаць аб Фасад як просты адаптар для некаторых складаных падсістэм. Facade
ізалюе складанасць у адным класе і дазваляе іншаму коду прыкладання выкарыстоўваць просты інтэрфейс.
У гэтым прыкладзе Facade
хавае складанасць API YouTube і бібліятэкі FFmpeg ад кліенцкага кода. Замест таго, каб працаваць з дзесяткамі класаў, кліент выкарыстоўвае просты метад на 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
Ваенна-марскі сектар - гэта сапраўдная глабальная эканамічная сіла, якая перайшла да 150-мільярднага рынку...
У мінулы панядзелак Financial Times абвясціла аб здзелцы з OpenAI. FT ліцэнзуе сваю журналістыку сусветнага ўзроўню...
Мільёны людзей плацяць за струменевыя паслугі, плацячы штомесячную абаненцкую плату. Распаўсюджана меркаванне, што вы…
Coveware ад Veeam працягне прадастаўляць паслугі рэагавання на інцыдэнты кібервымагальніцтва. Coveware будзе прапаноўваць судова-медыцынскую экспертызу і магчымасці выпраўлення…