Predvideni čas branja: 6 min
Oblikovalski vzorec ni koda, ki bi jo lahko kopirali in vstavili v naš program, kot lahko storimo s standardnimi funkcijami ali knjižnicami. Oblikovalski vzorec je splošen koncept, ki lahko reši določen problem. V bistvu model, katerega podrobnostim lahko sledimo in implementiramo rešitev, ki ustreza realnosti našega programa.
Modele pogosto zamenjujemo z algoritmi, ker oba koncepta opisujeta tipične rešitve nekaterih znanih problemov. Medtem ko je algoritem defiČe vedno obstaja jasen niz dejanj, s katerimi je mogoče doseči določen cilj, je model opis rešitve na višji ravni. Koda iz istega modela, uporabljena za dva različna programa, se lahko razlikuje.
Če želimo narediti analogijo, se lahko spomnimo kuharskega recepta: oba imata jasne korake za dosego cilja. Je pa model bolj kot projekt, katerega rezultat lahko vidite in kakšne so njegove značilnosti, točen vrstni red implementacije pa je odvisen od nas, ki pišemo kodo.
Večina vzorcev je opisanih zelo formalno, tako da jih lahko ljudje reproducirajo v številnih kontekstih. Spodaj si poglejmo elemente, ki so prisotni v opisu modela:
Programer lahko razvije programsko opremo, ne da bi vedel za obstoj oblikovalskih vzorcev. Mnogi to počnejo in zato izvajajo nekatere sheme, ne da bi se tega zavedali. Toda zakaj bi potem porabili čas za njihovo učenje?
Oblikovalski vzorci se razlikujejo po kompleksnosti, stopnji podrobnosti in obsegu uporabnosti v celotnem oblikovanem sistemu.
Po analogiji lahko naredimo križišče varnejše tako, da postavimo nekaj semaforjev ali zgradimo celotno večnivojsko križišče s podzemnimi prehodi za pešce.
Pogosto se imenujejo najosnovnejši modeli nizke ravni idiomi . Običajno veljajo samo za en sam programski jezik.
Najbolj univerzalni in visokokakovostni modeli so arhitekturni modeli . Razvijalci lahko implementirajo te vzorce v skoraj katerem koli jeziku. Za razliko od drugih vzorcev jih je mogoče uporabiti za oblikovanje arhitekture celotne aplikacije.
Poleg tega lahko vse modele razvrstimo glede na njihovo poskusili ali namen. Trije glavni razredi so:
Fasada je strukturni oblikovalski vzorec, ki zagotavlja poenostavljen vmesnik za knjižnico, ogrodje ali kateri koli drug zapleten nabor razredov.
Predpostavimo, da moramo omogočiti delovanje programske opreme na podlagi velikega nabora objektov, ki pripadajo sofisticirani knjižnici ali ogrodju. Običajno bi morali inicializirati vse te objekte, slediti odvisnostim, izvajati metode v pravilnem vrstnem redu in tako naprej.
Posledično bi poslovna logika razredov postala tesno povezana z izvedbenimi podrobnostmi razredov tretjih oseb, zaradi česar bi jih bilo težko razumeti in upravljati.
A facade
je razred, ki zagotavlja preprost vmesnik za kompleksen podsistem, ki vsebuje veliko gibljivih delov. A facade
lahko zagotovi omejeno funkcionalnost v primerjavi z neposrednim delom s podsistemom. Vendar pa vključuje samo funkcije, ki so stranke resnično pomembne.
Imej ga facade
uporaben je, ko moramo aplikacijo integrirati s sofisticirano knjižnico, ki ima na desetine funkcij, vendar potrebujemo le majhen del njene funkcionalnosti.
Na primer, aplikacija, ki naloži kratke smešne videoposnetke z mačkami v družabne medije, bi lahko potencialno uporabila profesionalno knjižnico za pretvorbo videa. Vse, kar resnično potrebujemo, pa je razred z enojno metodo encode(filename, format)
. Ko ustvarimo tak razred in ga povežemo s knjižnico za pretvorbo videa, bomo imeli svojega prvega facade
.
Na primer, telefonist v klicnem centru je kot a facade
. Pravzaprav, ko pokličemo telefonsko službo trgovine, da oddamo telefonsko naročilo, je operater naš facade
do vseh storitev in oddelkov trgovine. Operater omogoča preprost glasovni vmesnik za sistem naročanja, plačilne prehode in različne dostavne službe.
Razmisliti Fasada kot preprost adapter za nekatere kompleksne podsisteme. Facade
izolira kompleksnost znotraj posameznega razreda in omogoča drugi aplikacijski kodi uporabo preprostega vmesnika.
V tem primeru Facade
skrije zapletenost YouTube API-ja in knjižnice FFmpeg pred kodo odjemalca. Namesto dela z desetinami razredov stranka uporablja preprosto metodo na 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
Coveware by Veeam bo še naprej zagotavljal storitve odzivanja na incidente kibernetskega izsiljevanja. Coveware bo nudil forenziko in zmogljivosti sanacije ...
Prediktivno vzdrževanje revolucionira sektor nafte in plina z inovativnim in proaktivnim pristopom k upravljanju obratov.…
Britanski CMA je izdal opozorilo glede obnašanja Big Tech na trgu umetne inteligence. tam …
Odlok "Case Green", ki ga je oblikovala Evropska unija za povečanje energetske učinkovitosti stavb, je zaključil svoj zakonodajni postopek z ...