Perkiraan wektu maca: 6 menit
Pola desain dudu kode sing bisa disalin lan dilebokake ing program, kaya sing bisa ditindakake kanthi fungsi utawa perpustakaan standar. Pola desain minangka konsep umum sing bisa ngrampungake masalah tartamtu. Sejatine model sing rincian bisa kita tindakake lan ngleksanakake solusi sing cocog karo kasunyatan program kita.
Model asring bingung karo algoritma, amarga loro konsep kasebut nggambarake solusi khas kanggo sawetara masalah sing dikenal. Nalika algoritma defiYen tansah ana tumindak sing jelas sing bisa nggayuh tujuan tartamtu, model minangka gambaran sing luwih dhuwur babagan solusi. Kode saka model sing padha ditrapake kanggo rong program beda bisa uga beda.
Kepengin nggawe analogi, kita bisa mikir babagan resep masak: loro-lorone duwe langkah sing jelas kanggo nggayuh tujuan. Nanging, model luwih kaya proyek, sing sampeyan bisa ndeleng apa asil lan karakteristike, nanging urutan implementasine gumantung marang kita sing nulis kode kasebut.
Umume pola diterangake kanthi resmi supaya wong bisa ngasilake ing pirang-pirang konteks. Ayo ndeleng ing ngisor iki unsur-unsur sing ana ing deskripsi model:
Programmer bisa ngembangake piranti lunak tanpa ngerti anane pola desain. Akeh sing nindakake, lan mulane dheweke nindakake sawetara rencana tanpa ngerti. Nanging kenapa kita kudu nglampahi wektu sinau?
Pola desain beda-beda ing kerumitan, tingkat detail, lan skala aplikasi ing saindhenging sistem sing dirancang.
Kanthi analogi, kita bisa nggawe prapatan luwih aman kanthi nginstal sawetara lampu lalu lintas utawa mbangun kabeh persimpangan multilevel kanthi dalan lemah kanggo para pejalan kaki.
Model paling dhasar, tingkat rendah asring diarani idiom . Biasane mung ditrapake kanggo basa pamrograman siji.
Model sing paling universal lan dhuwur yaiku model arsitektur . Pangembang bisa ngetrapake pola kasebut ing meh kabeh basa. Ora kaya pola liyane, bisa digunakake kanggo ngrancang arsitektur kabeh aplikasi.
Salajengipun, kabeh model bisa diklasifikasikaké miturut sing dicoba utawa tujuan. Telung kelas utama yaiku:
Adul minangka pola desain struktural sing nyedhiyakake antarmuka sing disederhanakake menyang perpustakaan, kerangka, utawa kelas kompleks liyane.
Ayo nganggep kita kudu nggawe piranti lunak, adhedhasar sakumpulan obyek gedhe sing kalebu perpustakaan utawa kerangka kerja sing canggih. Biasane, kita kudu miwiti kabeh obyek kasebut, nglacak dependensi, nglakokake metode kanthi urutan sing bener, lan liya-liyane.
Akibaté, logika bisnis saka kelas bakal dadi tightly digandhengake karo rincian implementasine saka kelas pihak katelu, nggawe angel kanggo ngerti lan ngatur.
Una facade
iku kelas sing nyedhiyani antarmuka prasaja kanggo subsistem Komplek sing ngemot akeh bagean obah. A facade
bisa nyedhiyakake fungsi sing winates dibandhingake karo kerja langsung karo subsistem. Nanging, iku mung kalebu fitur sing pelanggan tenan peduli.
Duwe siji facade
iku migunani nalika kita kudu nggabungake app karo perpustakaan canggih sing wis Welasan fitur, nanging kita mung perlu bagean cilik saka sawijining fungsi.
Contone, aplikasi sing ngunggah video lucu sing cendhak karo kucing menyang media sosial bisa uga nggunakake perpustakaan konversi video profesional. Nanging, kabeh sing kita butuhake yaiku kelas kanthi metode tunggal encode(filename, format)
. Sawise nggawe kelas kasebut lan nyambungake menyang perpustakaan konversi video, kita bakal duwe sing pertama facade
.
Contone, operator telpon call center kaya a facade
. Nyatane, nalika kita nelpon layanan telpon toko kanggo nggawe pesenan telpon, operator iku kita facade
menyang kabeh layanan lan departemen toko. Operator nyedhiyakake antarmuka swara sing prasaja kanggo sistem pesenan, gateway pembayaran lan macem-macem layanan pangiriman.
Mikir babagan Adul minangka adaptor prasaja kanggo sawetara subsistem Komplek. Facade
ngisolasi kerumitan ing kelas siji lan ngidini kode aplikasi liyane nggunakake antarmuka prasaja.
Ing conto iki, Facade
ndhelikake kerumitan API YouTube lan perpustakaan FFmpeg saka kode klien. Tinimbang nggarap puluhan kelas, klien nggunakake cara sing gampang ing 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 dening Veeam bakal terus nyedhiyakake layanan respon insiden pemerasan cyber. Coveware bakal nawakake kemampuan forensik lan remediasi…
Pangopènan prediktif ngrevolusi sektor minyak & gas, kanthi pendekatan inovatif lan proaktif kanggo manajemen pabrik.…
CMA UK wis ngetokake bebaya babagan prilaku Big Tech ing pasar intelijen buatan. Ana…
Keputusan "Case Green", sing dirumusake dening Uni Eropa kanggo ningkatake efisiensi energi bangunan, wis rampung proses legislatif kanthi…