Perkiraan waktos maca: 6 menit
Pola desain sanes kode anu tiasa urang salin sareng selapkeun kana program urang, sapertos anu tiasa urang laksanakeun sareng fungsi atanapi perpustakaan standar. Pola desain mangrupa konsép umum anu mampuh ngaréngsékeun masalah anu tangtu. Dasarna modél anu rinci anu tiasa urang tuturkeun sareng ngalaksanakeun solusi anu cocog sareng kanyataan program urang.
Model mindeng bingung jeung algoritma, sabab duanana konsép ngajelaskeun solusi has pikeun sababaraha masalah dipikawanoh. Sedengkeun hiji algoritma defiLamun sok aya sakumpulan tindakan anu jelas anu tiasa ngahontal tujuan anu tangtu, modél mangrupikeun pedaran tingkat anu langkung luhur pikeun solusi. Kodeu tina model anu sarua dilarapkeun ka dua program béda bisa jadi béda.
Hoyong ngadamel analogi, urang tiasa mikirkeun resep masak: duanana gaduh léngkah anu jelas pikeun ngahontal tujuan. Sanajan kitu, model leuwih kawas proyék, nu bisa ningali naon hasilna tur ciri na, tapi urutan pasti palaksanaan gumantung kana urang nu nulis kode.
Kaseueuran pola dijelaskeun sacara formal pisan ku kituna masarakat tiasa ngahasilkeun deui dina seueur kontéks. Hayu urang tingali di handap unsur-unsur anu aya dina pedaran model:
Programmer tiasa ngembangkeun software tanpa terang ayana pola desain. Loba ngalakukeun, jeung alesan ieu aranjeunna nerapkeun sababaraha schemes tanpa nyaho eta. Tapi naha urang kudu méakkeun waktu diajar aranjeunna?
Pola desain béda dina pajeulitna, tingkat detil, sareng skala panerapan sapanjang sistem anu dirancang.
Ku analogi, urang tiasa ngadamel simpang langkung aman ku cara masang sababaraha lampu lalu lintas atanapi ngawangun sadayana silih bertingkat sareng jalur bawah tanah pikeun pejalan kaki.
Paling dasar, model-tingkat low mindeng disebut idiom . Aranjeunna biasana ngan dilarapkeun ka hiji basa programming.
Model anu paling universal sareng tingkat luhur nyaéta model arsitéktur . Pamekar tiasa nerapkeun pola ieu dina ampir sagala basa. Beda sareng pola anu sanés, aranjeunna tiasa dianggo pikeun ngararancang arsitéktur tina sakabéh aplikasi.
Saterusna, sagala model bisa digolongkeun nurutkeun maranéhanana diusahakeun atawa tujuan. Tilu kelas utama nyaéta:
Fasade mangrupa pola desain struktural nu nyadiakeun antarbeungeut saderhana ka perpustakaan, kerangka, atawa set kompléks séjén tina kelas.
Hayu urang nganggap urang kudu nyieun karya software, dumasar kana susunan badag objék nu milik perpustakaan canggih atawa kerangka. Biasana, urang kedah ngamimitian sadayana obyék ieu, ngalacak katergantungan, ngalaksanakeun metode dina urutan anu leres, sareng saterasna.
Hasilna, logika bisnis kelas-kelas bakal jadi gandeng pageuh kana detil palaksanaan kelas pihak katilu, sahingga hésé ngarti tur ngatur.
Una facade
mangrupakeun kelas nu nyadiakeun panganteur basajan ka subsistem kompléks nu ngandung loba bagian pindah. A facade
bisa nyadiakeun pungsionalitas kawates dibandingkeun gawé langsung jeung subsistem. Nanging, éta ngan ukur kalebet fitur anu leres-leres dipikanyaah ku para nasabah.
Gaduh hiji facade
Éta mangpaat nalika urang kedah ngahijikeun aplikasi sareng perpustakaan canggih anu ngagaduhan puluhan fitur, tapi urang ngan ukur peryogi sabagian leutik fungsionalitasna.
Contona, hiji aplikasi nu unggah video lucu pondok nampilkeun ucing ka média sosial berpotensi ngagunakeun perpustakaan konversi video profésional. Nanging, sadayana anu urang peryogikeun nyaéta kelas kalayan metode tunggal encode(filename, format)
. Saatos nyiptakeun kelas sapertos kitu sareng nyambungkeun kana perpustakaan konvérsi pidéo, urang bakal ngagaduhan anu munggaran facade
.
Contona, operator telepon call center kawas a facade
. Nyatana, nalika urang nelepon ka layanan telepon toko pikeun nempatkeun pesenan telepon, operator mangrupikeun milik urang facade
nuju sadaya jasa sareng departemén toko. Operator nyadiakeun antarbeungeut sora basajan kana sistem pesenan, gateways pamayaran jeung sagala rupa layanan pangiriman.
Pikirkeun Fasade salaku adaptor basajan pikeun sababaraha subsistem kompléks. Facade
ngasingkeun pajeulitna dina hiji kelas tunggal tur ngamungkinkeun kode aplikasi sejenna ngagunakeun panganteur basajan.
Dina conto ieu, Facade
nyumput pajeulitna API YouTube jeung perpustakaan FFmpeg tina kode klien. Gantina gawé bareng puluhan kelas, klien ngagunakeun métode basajan on 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 ku Veeam bakal terus nyayogikeun jasa réspon kajadian cyber extortion. Coveware bakal nawiskeun kamampuan forensik sareng remediasi…
Pangropéa prediktif ngarévolusi sektor minyak & gas, kalayan pendekatan inovatif sareng proaktif pikeun ngokolakeun pabrik.…
CMA Inggris parantos ngaluarkeun peringatan ngeunaan paripolah Big Tech di pasar intelijen buatan. Tuh…
Kaputusan "Imah Héjo", dirumuskeun ku Uni Éropa pikeun ningkatkeun efisiensi énergi gedong, parantos nyimpulkeun prosés législatifna sareng…