Laŭtaksa legotempo: 6 minutoj
Dezajna ŝablono ne estas kodo, kiun ni povas kopii kaj enmeti en nian programon, kiel ni povas fari kun normaj funkcioj aŭ bibliotekoj. La dezajnopadrono estas ĝenerala koncepto kapabla je solvi specialan problemon. Esence modelo, kies detalojn ni povas sekvi kaj efektivigi solvon, kiu kongruas kun la realeco de nia programo.
Modeloj ofte estas konfuzitaj kun algoritmoj, ĉar ambaŭ konceptoj priskribas tipajn solvojn al kelkaj konataj problemoj. Dum algoritmo defiSe ĉiam estas klara aro de agoj, kiuj povas atingi certan celon, modelo estas pli alta nivela priskribo de solvo. Kodo de la sama modelo aplikita al du malsamaj programoj povas esti malsama.
Volante fari analogion, ni povas pensi pri kuira recepto: ambaŭ havas klarajn paŝojn por atingi celon. Tamen, modelo pli similas al projekto, de kiu vi povas vidi, kio estas la rezulto kaj ĝiaj trajtoj, sed la ĝusta ordo de efektivigo dependas de ni, kiuj skribas la kodon.
Plej multaj ŝablonoj estas priskribitaj tre formale, por ke homoj povu reprodukti ilin en multaj kuntekstoj. Ni vidu sube la elementojn, kiuj ĉeestas en la priskribo de modelo:
Programisto povas evoluigi programaron sen scii la ekziston de dezajnaj ŝablonoj. Multaj faras, kaj tial ili efektivigas iujn skemojn sen scii ĝin. Sed kial do ni pasigu tempon lernante ilin?
Dezajnaj padronoj malsamas en komplekseco, nivelo de detalo kaj skalo de aplikebleco ĉie en la dizajnita sistemo.
Analogie, ni povas fari intersekciĝon pli sekura instalante kelkajn trafiklumojn aŭ konstruante tutan plurnivelan vojnodon kun subteraj trairejoj por piedirantoj.
La plej bazaj, malaltnivelaj modeloj ofte estas nomitaj idiomaĵoj . Ili kutime validas nur por ununura programlingvo.
La plej universalaj kaj altnivelaj modeloj estas arkitekturaj modeloj . Programistoj povas efektivigi ĉi tiujn ŝablonojn en preskaŭ ajna lingvo. Male al aliaj ŝablonoj, ili povas esti uzataj por desegni la arkitekturon de tuta aplikaĵo.
Krome, ĉiuj modeloj povas esti klasifikitaj laŭ ilia provis aŭ celo. La tri ĉefaj klasoj estas:
Fasadon estas struktura dezajnopadrono kiu disponigas simpligitan interfacon al biblioteko, kadro, aŭ ajna alia kompleksa aro de klasoj.
Ni supozu, ke ni devas fari programaron funkcii, surbaze de granda aro da objektoj, kiuj apartenas al altnivela biblioteko aŭ kadro. Normale, ni bezonus pravalorigi ĉiujn ĉi objektojn, konservi trakon de dependecoj, ekzekuti metodojn en la ĝusta ordo, ktp.
Kiel rezulto, la komerca logiko de la klasoj iĝus malloze kunligita al la efektivigdetaloj de triaj klasoj, malfaciligante ilin kompreni kaj administri.
una facade
estas klaso kiu disponigas simplan interfacon al kompleksa subsistemo kiu enhavas multajn moviĝantajn partojn. A facade
povas disponigi limigitan funkciecon komparite kun laborado rekte kun la subsistemo. Tamen ĝi nur inkluzivas la funkciojn, pri kiuj la klientoj vere zorgas.
Havu unu facade
ĝi estas utila kiam ni bezonas integri la apon kun kompleksa biblioteko kiu havas dekojn da funkcioj, sed ni bezonas nur malgrandan parton de ĝia funkcieco.
Ekzemple, aplikaĵo kiu alŝutas mallongajn amuzajn filmetojn kun katoj al sociaj amaskomunikiloj povus eble uzi profesian videokonvertan bibliotekon. Tamen, ĉio, kion ni vere bezonas, estas klaso kun la ununura metodo encode(filename, format)
. Post krei tian klason kaj konekti ĝin al la videokonverta biblioteko, ni havos nian unuan facade
.
Ekzemple, la telefonisto de telefoncentro estas kiel a facade
. Fakte, kiam ni vokas la telefonservon de vendejo por fari telefonmendon, telefonisto estas nia facade
al ĉiuj servoj kaj fakoj de la vendejo. La funkciigisto provizas simplan voĉan interfacon al la menda sistemo, pagpordoj kaj diversaj liverservoj.
Pripensi Fasadon kiel simpla adaptilo por kelkaj kompleksaj subsistemoj. Facade
izolas la kompleksecon ene de ununura klaso kaj permesas al alia aplikaĵokodo uzi la simplan interfacon.
En ĉi tiu ekzemplo, Facade
kaŝas la kompleksecon de la biblioteko de YouTube API kaj FFmpeg de la klientokodo. Anstataŭ labori kun dekoj da klasoj, la kliento uzas simplan metodon sur Fasado.
<?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 de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...
Prognoza prizorgado revolucias la petrolon kaj gasan sektoron, kun noviga kaj iniciatema aliro al plantadministrado...
La UK CMA publikigis averton pri la konduto de Big Tech en la merkato de artefarita inteligenteco. Tie…
La Dekreto "Verdaj Domoj", formulita de Eŭropa Unio por plibonigi la energi-efikecon de konstruaĵoj, finis sian leĝdonan procezon per...