Áætlaður lestrartími: 6 minuti
Hönnunarmynstur er ekki kóði sem við getum afritað og sett inn í forritið okkar, eins og við getum gert með stöðluðum aðgerðum eða bókasöfnum. Hönnunarmynstrið er almennt hugtak sem getur leyst tiltekið vandamál. Í grundvallaratriðum líkan sem við getum fylgst með og útfært lausn sem passar við raunveruleika forritsins okkar.
Líkönum er oft ruglað saman við reiknirit vegna þess að bæði hugtökin lýsa dæmigerðum lausnum á nokkrum þekktum vandamálum. Þó reiknirit defiEf það er alltaf skýrt sett af aðgerðum sem geta náð ákveðnu markmiði er líkan lýsing á lausn á hærra stigi. Kóði úr sömu gerð sem notaður er á tvö mismunandi forrit getur verið mismunandi.
Við viljum gera líkingu, við getum hugsað okkur matreiðsluuppskrift: bæði hafa skýr skref til að ná markmiði. Hins vegar er líkan meira eins og verkefni, þar sem þú getur séð hver útkoman er og einkenni þess, en nákvæm útfærsluröð fer eftir okkur sem skrifum kóðann.
Flestum mynstrum er lýst mjög formlega þannig að fólk geti endurskapað þau í mörgum samhengi. Við skulum sjá fyrir neðan þá þætti sem eru til staðar í lýsingu á líkani:
Forritari getur þróað hugbúnað án þess að vita tilvist hönnunarmynstra. Margir gera það og af þessum sökum innleiða þeir sum kerfi án þess að vita af því. En hvers vegna ættum við þá að eyða tíma í að læra þau?
Hönnunarmynstur eru mismunandi hvað varðar flókið, smáatriði og umfang notkunar í gegnum hannaða kerfið.
Á hliðstæðan hátt getum við gert gatnamót öruggari með því að setja upp nokkur umferðarljós eða byggja heila fjölþrepa skiptistöð með neðanjarðargöngum fyrir gangandi vegfarendur.
Algengustu, lágu módelin eru oft kölluð orðatiltæki . Þeir eiga venjulega aðeins við um eitt forritunarmál.
Alhliða og hágæða módelin eru byggingarlistarlíkön . Hönnuðir geta innleitt þessi mynstur á nánast hvaða tungumáli sem er. Ólíkt öðrum mynstrum er hægt að nota þau til að hanna arkitektúr heils forrits.
Ennfremur er hægt að flokka allar gerðir eftir þeim reyndi eða tilgangi. Aðalflokkarnir þrír eru:
Framhlið er burðarvirkishönnunarmynstur sem veitir einfaldað viðmót við bókasafn, ramma eða önnur flókin flokkaflokk.
Gerum ráð fyrir að við þurfum að láta hugbúnað virka, byggt á stóru safni af hlutum sem tilheyra háþróuðu bókasafni eða ramma. Venjulega þyrftum við að frumstilla alla þessa hluti, halda utan um ósjálfstæði, framkvæma aðferðir í réttri röð og svo framvegis.
Fyrir vikið myndi viðskiptarökfræði flokkanna verða þétt tengd útfærsluupplýsingum þriðja aðila flokka, sem gerir þá erfitt að skilja og stjórna.
a facade
er flokkur sem veitir einfalt viðmót við flókið undirkerfi sem inniheldur marga hreyfanlega hluta. A facade
getur veitt takmarkaða virkni miðað við að vinna beint með undirkerfinu. Hins vegar inniheldur það aðeins þá eiginleika sem viðskiptavinum þykir mjög vænt um.
Hafðu einn facade
það er gagnlegt þegar við þurfum að samþætta appið við háþróað bókasafn sem hefur heilmikið af eiginleikum, en við þurfum aðeins lítinn hluta af virkni þess.
Til dæmis gæti app sem hleður upp stuttum fyndnum myndböndum með köttum á samfélagsmiðla mögulega notað faglegt myndbandsumbreytingarsafn. Hins vegar, allt sem við þurfum í raun er flokkur með einni aðferð encode(filename, format)
. Eftir að hafa búið til slíkan flokk og tengt hann við myndbandsumbreytingarsafnið munum við hafa okkar fyrsta facade
.
Til dæmis er símastjóri símavers eins og a facade
. Reyndar, þegar við hringjum í símaþjónustu verslana til að leggja inn símapöntun, þá er símafyrirtækið okkar facade
gagnvart allri þjónustu og deildum verslunarinnar. Rekstraraðili útvegar einfalt raddviðmót við pöntunarkerfið, greiðslugáttir og ýmsa afhendingarþjónustu.
Hugsa um Framhlið sem einfalt millistykki fyrir sum flókin undirkerfi. Facade
einangrar flókið innan eins flokks og gerir öðrum forritakóða kleift að nota einfalda viðmótið.
Í þessu dæmi, Facade
felur margbreytileika YouTube API og FFmpeg bókasafnsins fyrir biðlarakóðanum. Í stað þess að vinna með tugi flokka notar viðskiptavinurinn einfalda aðferð á 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 frá Veeam mun halda áfram að veita viðbragðsþjónustu fyrir tölvukúgun. Coveware mun bjóða upp á réttar- og úrbótamöguleika ...
Forspárviðhald er að gjörbylta olíu- og gasgeiranum, með nýstárlegri og fyrirbyggjandi nálgun við verksmiðjustjórnun.…
Breska CMA hefur gefið út viðvörun um hegðun Big Tech á gervigreindarmarkaði. Þarna…
„Case Green“ tilskipunin, mótuð af Evrópusambandinu til að auka orkunýtni bygginga, hefur lokið löggjafarferli sínu með...