Taxminiy o'qish vaqti: 6 daqiqada
Dizayn namunasi standart funksiyalar yoki kutubxonalar bilan qilishimiz mumkin bo'lganidek, biz nusxa ko'chirish va dasturimizga kiritishimiz mumkin bo'lgan kod emas. Dizayn namunasi ma'lum bir muammoni hal qilishga qodir bo'lgan umumiy tushunchadir. Asosan, biz uning tafsilotlariga amal qilishimiz va dasturimizning haqiqatiga mos keladigan yechimni amalga oshirishimiz mumkin bo'lgan model.
Modellar ko'pincha algoritmlar bilan chalkashib ketadi, chunki ikkala tushuncha ham ba'zi ma'lum muammolarning tipik echimlarini tavsiflaydi. Algoritm bo'lganda defiAgar har doim ma'lum bir maqsadga erishish mumkin bo'lgan aniq harakatlar to'plami mavjud bo'lsa, model - bu yechimning yuqori darajadagi tavsifi. Ikki xil dasturga qo'llaniladigan bir xil modeldagi kod boshqacha bo'lishi mumkin.
O'xshatishni istab, pishirish retsepti haqida o'ylashimiz mumkin: ikkalasi ham maqsadga erishish uchun aniq qadamlarga ega. Biroq, model ko'proq loyihaga o'xshaydi, uning natijasi va uning xususiyatlarini ko'rishingiz mumkin, ammo amalga oshirishning aniq tartibi kodni yozgan bizga bog'liq.
Aksariyat naqshlar juda rasmiy tarzda tasvirlangan, shuning uchun odamlar ularni turli kontekstlarda takrorlashlari mumkin. Keling, model tavsifida mavjud bo'lgan elementlarni quyida ko'rib chiqaylik:
Dasturchi dizayn naqshlari mavjudligini bilmasdan dasturiy ta'minotni ishlab chiqishi mumkin. Ko'pchilik buni qiladi va shu sababli ular bilmagan holda ba'zi sxemalarni amalga oshiradilar. Ammo nega biz ularni o'rganishga vaqt sarflashimiz kerak?
Dizayn naqshlari murakkabligi, tafsilotlar darajasi va loyihalashtirilgan tizimda qo'llanilishi ko'lami bilan farqlanadi.
O'xshashlik bo'yicha, biz bir nechta svetoforlarni o'rnatish yoki piyodalar uchun er osti o'tish joylari bilan butun ko'p qavatli yo'lni qurish orqali chorraha xavfsizroq qilishimiz mumkin.
Eng asosiy, past darajadagi modellar ko'pincha chaqiriladi idiomalar . Ular odatda faqat bitta dasturlash tiliga tegishli.
Eng universal va yuqori darajadagi modellar arxitektura modellari . Ishlab chiquvchilar ushbu naqshlarni deyarli har qanday tilda amalga oshirishlari mumkin. Boshqa naqshlardan farqli o'laroq, ular butun ilovaning arxitekturasini loyihalash uchun ishlatilishi mumkin.
Bundan tashqari, barcha modellarni ularning xususiyatlariga ko'ra tasniflash mumkin harakat qildi yoki maqsad. Uchta asosiy sinflar:
Fasad kutubxona, ramka yoki boshqa har qanday murakkab sinflar to'plamiga soddalashtirilgan interfeysni ta'minlovchi tizimli dizayn namunasidir.
Faraz qilaylik, biz dasturiy ta'minotni murakkab kutubxona yoki ramkaga tegishli bo'lgan katta ob'ektlar to'plamiga asoslangan holda ishlashimiz kerak. Odatda, biz ushbu ob'ektlarning barchasini ishga tushirishimiz, bog'liqliklarni kuzatib borishimiz, usullarni to'g'ri tartibda bajarishimiz va hokazo.
Natijada, sinflarning biznes mantig'i uchinchi tomon sinflarini amalga oshirish tafsilotlari bilan chambarchas bog'liq bo'lib, ularni tushunish va boshqarishni qiyinlashtiradi.
Una facade
ko'plab harakatlanuvchi qismlarni o'z ichiga olgan murakkab quyi tizimga oddiy interfeysni ta'minlovchi sinfdir. A facade
to'g'ridan-to'g'ri quyi tizim bilan ishlashga nisbatan cheklangan funksionallikni ta'minlashi mumkin. Biroq, u faqat mijozlarga g'amxo'rlik qiladigan xususiyatlarni o'z ichiga oladi.
Bir bor facade
biz ilovani o'nlab xususiyatlarga ega bo'lgan murakkab kutubxona bilan birlashtirishimiz kerak bo'lganda foydali bo'ladi, lekin biz uning funksionalligining kichik bir qismiga muhtojmiz.
Misol uchun, mushuklar bilan qisqa kulgili videolarni ijtimoiy tarmoqlarga yuklaydigan ilova professional video konversiya kutubxonasidan foydalanishi mumkin. Biroq, bizga haqiqatan ham kerak bo'lgan yagona usul - bu sinf encode(filename, format)
. Bunday sinfni yaratib, uni video konversiya kutubxonasiga ulaganimizdan so'ng, bizda birinchi bo'ladi facade
.
Masalan, qo'ng'iroq markazining telefon operatori a facade
. Darhaqiqat, biz telefon orqali buyurtma berish uchun do'konning telefon xizmatiga qo'ng'iroq qilsak, operator bizniki facade
do'konning barcha xizmatlari va bo'limlariga. Operator buyurtma berish tizimi, to‘lov shlyuzlari va turli yetkazib berish xizmatlariga oddiy ovozli interfeysni taqdim etadi.
Haqida o'ylamoq Fasad ba'zi murakkab quyi tizimlar uchun oddiy adapter sifatida. Facade
murakkablikni bitta sinf ichida ajratib turadi va boshqa dastur kodlari oddiy interfeysdan foydalanishga imkon beradi.
Bu misolda, Facade
YouTube API va FFmpeg kutubxonasining murakkabligini mijoz kodidan yashiradi. Mijoz o'nlab sinflar bilan ishlash o'rniga Fasadda oddiy usuldan foydalanadi.
<?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
Veeam tomonidan ishlab chiqarilgan Coveware kiber tovlamachilik hodisalariga javob berish xizmatlarini taqdim etishda davom etadi. Coveware sud tibbiyoti va remediatsiya imkoniyatlarini taklif qiladi ...
Bashoratli texnik xizmat ko'rsatish zavodlarni boshqarishga innovatsion va proaktiv yondashuv bilan neft va gaz sektorini inqilob qilmoqda.…
Buyuk Britaniya CMA Big Tech kompaniyasining sun'iy intellekt bozoridagi xatti-harakatlari haqida ogohlantirish e'lon qildi. U yerda…
Evropa Ittifoqi tomonidan binolarning energiya samaradorligini oshirish uchun ishlab chiqilgan "Yashil uylar" qarori qonunchilik jarayonini yakunladi ...