Eeldatav lugemisaeg: 6 minutit
Kujundusmuster ei ole kood, mida saame kopeerida ja oma programmi sisestada, nagu me saame teha standardsete funktsioonide või teekide puhul. Kujundusmuster on üldine kontseptsioon, mis suudab lahendada konkreetse probleemi. Põhimõtteliselt mudel, mille üksikasju saame jälgida ja rakendada lahendust, mis sobib meie programmi tegelikkusega.
Mudeleid aetakse sageli segi algoritmidega, sest mõlemad mõisted kirjeldavad tüüpilisi lahendusi mõnele teadaolevale probleemile. Kuigi algoritm defiKui alati on olemas selge tegevuste kogum, millega saab teatud eesmärgi saavutada, on mudel lahenduse kõrgema taseme kirjeldus. Kahe erineva programmiga sama mudeli kood võib olla erinev.
Soovides teha analoogiat, võime mõelda toiduvalmistamise retseptile: mõlemal on eesmärgi saavutamiseks selged sammud. Mudel on aga pigem projekt, mille tulemus ja omadused on näha, aga täpne realiseerimise järjekord sõltub meist, kes koodi kirjutame.
Enamikku mustreid kirjeldatakse väga formaalselt, et inimesed saaksid neid paljudes kontekstides reprodutseerida. Vaatame allpool elemente, mis mudeli kirjelduses on:
Programmeerija saab tarkvara arendada, teadmata disainimustrite olemasolust. Paljud teevad seda ja seetõttu rakendavad nad mõningaid skeeme teadmata. Aga miks peaksime siis kulutama aega nende õppimisele?
Disainimustrid erinevad kogu kavandatud süsteemi keerukuse, üksikasjalikkuse ja rakendatavuse skaala poolest.
Analoogia põhjal saame muuta ristmiku turvalisemaks, paigaldades mõne foori või ehitades terve mitmetasandilise ristmiku koos maa-aluste käikudega jalakäijatele.
Sageli nimetatakse kõige elementaarsemaid madala taseme mudeleid idioomid . Tavaliselt kehtivad need ainult ühe programmeerimiskeele kohta.
Kõige universaalsemad ja kõrgetasemelised mudelid on arhitektuursed mudelid . Arendajad saavad neid mustreid rakendada peaaegu igas keeles. Erinevalt teistest mustritest saab neid kasutada kogu rakenduse arhitektuuri kujundamiseks.
Lisaks saab kõiki mudeleid klassifitseerida nende järgi üritas või eesmärk. Kolm peamist klassi on:
Fassaad on struktuurse disaini muster, mis pakub lihtsustatud liidest teegile, raamistikule või mõnele muule keerukale klassikomplektile.
Oletame, et peame tarkvara tööle panema, tuginedes suurele hulgale objektidele, mis kuuluvad keerukasse teeki või raamistikku. Tavaliselt peaksime kõik need objektid lähtestama, jälgima sõltuvusi, käivitama meetodeid õiges järjekorras ja nii edasi.
Selle tulemusel seotakse klasside äriloogika tihedalt kolmandate osapoolte klasside rakendamise üksikasjadega, mistõttu on neid raske mõista ja hallata.
A. facade
on klass, mis pakub lihtsa liidese keerukale allsüsteemile, mis sisaldab palju liikuvaid osi. A facade
võib pakkuda piiratud funktsionaalsust võrreldes otse allsüsteemiga töötamisega. See sisaldab aga ainult neid funktsioone, millest kliendid tõeliselt hoolivad.
Kas teil on üks facade
see on kasulik, kui peame integreerima rakenduse keeruka teegiga, millel on kümneid funktsioone, kuid vajame vaid väikest osa selle funktsionaalsusest.
Näiteks rakendus, mis laadib sotsiaalmeediasse üles lühikesi naljakaid videoid kassidega, võib potentsiaalselt kasutada professionaalset videoteeki. Kuid kõik, mida me tegelikult vajame, on ühe meetodiga klass encode(filename, format)
. Pärast sellise klassi loomist ja ühendamist videokonversiooni teegiga on meil esimene facade
.
Näiteks kõnekeskuse telefonioperaator on nagu a facade
. Tegelikult, kui helistame telefonitellimuse tegemiseks poe telefoniteenindusse, on operaator meie päralt facade
kõigi kaupluse teenuste ja osakondade suhtes. Operaator pakub lihtsat häälliidest tellimissüsteemile, makseväravatele ja erinevatele kohaletoimetamisteenustele.
Mõtlema Fassaad lihtsa adapterina mõne keeruka alamsüsteemi jaoks. Facade
isoleerib keerukuse ühes klassis ja võimaldab teistel rakenduskoodidel kasutada lihtsat liidest.
Selles näites Facade
peidab kliendikoodi eest YouTube'i API ja FFmpegi teegi keerukuse. Selle asemel, et töötada kümnete klassidega, kasutab klient Fassaadil lihtsat meetodit.
<?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
Veeami Coveware jätkab küberväljapressimise juhtumitele reageerimise teenuste pakkumist. Coveware pakub kohtuekspertiisi ja heastamisvõimalusi…
Ennustav hooldus muudab nafta- ja gaasisektori pöördeliseks uuendusliku ja ennetava lähenemisega tehaste juhtimisele.…
Ühendkuningriigi CMA on väljastanud hoiatuse Big Techi käitumise kohta tehisintellekti turul. Seal…
Euroopa Liidu poolt hoonete energiatõhususe suurendamiseks koostatud roheliste majade dekreet on lõpetanud oma seadusandliku protsessi…