Predviđeno vrijeme čitanja: 6 minute
Obrazac dizajna nije kod koji možemo kopirati i umetnuti u naš program, kao što to možemo učiniti sa standardnim funkcijama ili bibliotekama. Obrazac dizajna je opći koncept koji može riješiti određeni problem. U osnovi model čije detalje možemo pratiti i implementirati rješenje koje odgovara realnosti našeg programa.
Modeli se često brkaju sa algoritmima, jer oba koncepta opisuju tipična rješenja nekih poznatih problema. Dok je algoritam defiAko uvijek postoji jasan skup akcija koje mogu postići određeni cilj, model je opis rješenja višeg nivoa. Kod iz istog modela primijenjen na dva različita programa može biti različit.
Želeći da napravimo analogiju, možemo smisliti recept za kuhanje: oba imaju jasne korake za postizanje cilja. Međutim, model je više kao projekat čiji se rezultat može vidjeti i njegove karakteristike, ali tačan redoslijed implementacije ovisi o nama koji pišemo kod.
Većina obrazaca opisana je vrlo formalno tako da ih ljudi mogu reproducirati u mnogim kontekstima. Pogledajmo u nastavku elemente koji su prisutni u opisu modela:
Programer može razviti softver bez znanja o postojanju obrazaca dizajna. Mnogi to rade i iz tog razloga implementiraju neke šeme, a da to ne znaju. Ali zašto bismo onda trošili vrijeme na njihovo učenje?
Dizajnerski obrasci se razlikuju po složenosti, nivou detalja i skali primenljivosti kroz projektovani sistem.
Po analogiji, raskrsnicu možemo učiniti sigurnijom postavljanjem nekoliko semafora ili izgradnjom cijele petlje na više nivoa sa podzemnim prolazima za pješake.
Često se nazivaju najosnovniji modeli niskog nivoa idiomi . Obično se primjenjuju samo na jedan programski jezik.
Najuniverzalniji i vrhunski modeli su arhitektonski modeli . Programeri mogu implementirati ove obrasce na gotovo bilo koji jezik. Za razliku od drugih obrazaca, oni se mogu koristiti za dizajniranje arhitekture cijele aplikacije.
Nadalje, svi modeli se mogu klasificirati prema njihovoj pokušao ili svrha. Tri glavne klase su:
Fasada je strukturalni obrazac dizajna koji pruža pojednostavljeno sučelje za biblioteku, okvir ili bilo koji drugi složeni skup klasa.
Pretpostavimo da je potrebno da softver funkcioniše na osnovu velikog skupa objekata koji pripadaju sofisticiranoj biblioteci ili okviru. Obično bismo morali inicijalizirati sve ove objekte, pratiti ovisnosti, izvršiti metode ispravnim redoslijedom, itd.
Kao rezultat toga, poslovna logika klasa bi postala usko povezana sa detaljima implementacije klasa trećih strana, što bi ih činilo teškim za razumevanje i upravljanje.
Una facade
je klasa koja pruža jednostavan interfejs za složeni podsistem koji sadrži mnogo pokretnih delova. A facade
može pružiti ograničenu funkcionalnost u poređenju sa direktnim radom sa podsistemom. Međutim, uključuje samo one karakteristike do kojih je kupcima zaista stalo.
Uzmi jedan facade
korisno je kada trebamo integrirati aplikaciju sa sofisticiranom bibliotekom koja ima desetke funkcija, ali nam je potreban samo mali dio njene funkcionalnosti.
Na primjer, aplikacija koja postavlja kratke smiješne videozapise s mačkama na društvene mreže potencijalno bi mogla koristiti profesionalnu biblioteku za konverziju videa. Međutim, sve što nam zaista treba je klasa sa jednom metodom encode(filename, format)
. Nakon kreiranja takve klase i povezivanja sa bibliotekom video konverzije, imat ćemo prvu facade
.
Na primjer, telefonski operater pozivnog centra je kao a facade
. U stvari, kada pozovemo telefonsku službu prodavnice da naručimo telefonom, naš je operater facade
prema svim službama i odjelima trgovine. Operater pruža jednostavan glasovni interfejs za sistem naručivanja, platne prolaze i razne usluge dostave.
Misliti o Fasada kao jednostavan adapter za neke složene podsisteme. Facade
izoluje složenost unutar jedne klase i dozvoljava drugom kodu aplikacije da koristi jednostavno sučelje.
U ovom primjeru, Facade
skriva složenost YouTube API-ja i FFmpeg biblioteke od klijentskog koda. Umjesto rada sa desetinama klasa, klijent koristi jednostavnu metodu 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 od strane Veeam-a će nastaviti da pruža usluge odgovora na incidente u slučaju sajber iznude. Coveware će ponuditi mogućnosti forenzike i sanacije…
Prediktivno održavanje revolucionira sektor nafte i plina, s inovativnim i proaktivnim pristupom upravljanju postrojenjima.…
UK CMA izdao je upozorenje o ponašanju Big Tech-a na tržištu umjetne inteligencije. Tamo…
Uredba o „zelenim kućama“, koju je formulisala Evropska unija za poboljšanje energetske efikasnosti zgrada, završila je svoj zakonodavni proces sa…