Болжалды оқу уақыты: 6 минуты
Дизайн үлгісі стандартты функциялармен немесе кітапханалармен жасай алатындай, біз көшіріп, бағдарламамызға кірістіретін код емес. Дизайн үлгісі - бұл белгілі бір мәселені шешуге қабілетті жалпы түсінік. Негізінде біз егжей-тегжейлерін қадағалай алатын және бағдарламамыздың шындығына сәйкес шешімді жүзеге асыра алатын модель.
Модельдер көбінесе алгоритмдермен шатастырылады, өйткені екі ұғым да кейбір белгілі есептердің типтік шешімдерін сипаттайды. Алгоритм болған кезде defiБелгілі бір мақсатқа жетуге болатын іс-әрекеттердің әрқашан нақты жиынтығы болса, модель шешімнің жоғары деңгейлі сипаттамасы болып табылады. Екі түрлі бағдарламаға қолданылатын бір үлгідегі код әртүрлі болуы мүмкін.
Аналогия жасағымыз келсе, біз пісіру рецептін ойлай аламыз: екеуінде де мақсатқа жету үшін нақты қадамдар бар. Дегенмен, модель жобаға көбірек ұқсайды, оның нәтижесі қандай екенін және оның сипаттамаларын көруге болады, бірақ нақты жүзеге асыру тәртібі кодты жазған бізге байланысты.
Көптеген үлгілер адамдар оларды көптеген контексттерде ойната алатындай етіп өте ресми түрде сипатталған. Төменде модель сипаттамасында бар элементтерді қарастырайық:
Бағдарламалаушы дизайн үлгілерінің бар екенін білмей-ақ бағдарламалық жасақтаманы жасай алады. Көбісі жасайды, сол себепті олар білмей кейбір схемаларды жүзеге асырады. Бірақ неге біз оларды үйренуге уақыт бөлуіміз керек?
Дизайн үлгілері күрделілігімен, егжей-тегжейлі деңгейімен және жобаланған жүйеде қолданылу ауқымымен ерекшеленеді.
Аналогия бойынша, біз бірнеше бағдаршам орнату немесе жаяу жүргіншілерге арналған жерасты өткелдері бар көп деңгейлі жол айырығын салу арқылы қиылысты қауіпсіз ете аламыз.
Ең негізгі, төменгі деңгейлі модельдер жиі аталады идиомалар . Олар әдетте бір бағдарламалау тіліне ғана қолданылады.
Ең әмбебап және жоғары деңгейлі модельдер сәулет үлгілері . Әзірлеушілер бұл үлгілерді іс жүзінде кез келген тілде жүзеге асыра алады. Басқа үлгілерден айырмашылығы, олар бүкіл қолданбаның архитектурасын жобалау үшін пайдаланылуы мүмкін.
Сонымен қатар, барлық модельдерді олардың түріне қарай жіктеуге болады тырысты немесе мақсат. Үш негізгі сыныптар:
Фасад кітапханаға, фреймворкке немесе сыныптардың кез келген басқа күрделі жиынына оңайлатылған интерфейсті қамтамасыз ететін құрылымдық дизайн үлгісі.
Күрделі кітапханаға немесе фреймворкке жататын нысандардың үлкен жинағына негізделген бағдарламалық жасақтама жұмысын жасауымыз керек делік. Әдетте, бізге осы нысандардың барлығын инициализациялау, тәуелділіктерді қадағалау, әдістерді дұрыс ретпен орындау және т.б. қажет болады.
Нәтижесінде, сыныптардың іскерлік логикасы үшінші тарап сыныптарының іске асыру мәліметтерімен тығыз байланыста болады, бұл оларды түсіну мен басқаруды қиындатады.
Una facade
көптеген қозғалмалы бөліктерді қамтитын күрделі ішкі жүйеге қарапайым интерфейсті қамтамасыз ететін класс. А facade
ішкі жүйемен тікелей жұмыс істеумен салыстырғанда шектеулі функционалдылықты қамтамасыз етуі мүмкін. Дегенмен, ол тек тұтынушылар шынымен қызықтыратын мүмкіндіктерді қамтиды.
Біреуі бар facade
бұл қолданбаны ондаған мүмкіндіктері бар күрделі кітапханамен біріктіру қажет болғанда пайдалы, бірақ бізге оның функционалдығының аз ғана бөлігі қажет.
Мысалы, әлеуметтік медиаға мысықтар бейнеленген қысқа күлкілі бейнелерді жүктеп салатын қолданба кәсіби бейне түрлендіру кітапханасын пайдалануы мүмкін. Дегенмен, бізге шын мәнінде қажет нәрсе - жалғыз әдіспен класс encode(filename, format)
. Осындай класс жасап, оны бейне түрлендіру кітапханасына қосқаннан кейін бізде бірінші болады facade
.
Мысалы, байланыс орталығының телефон операторы а facade
. Шындығында, телефон арқылы тапсырыс беру үшін дүкеннің телефон қызметіне хабарлассақ, оператор біздікі facade
дүкеннің барлық қызметтері мен бөлімдеріне қатысты. Оператор тапсырыс беру жүйесіне, төлем шлюзіне және әртүрлі жеткізу қызметтеріне қарапайым дауыстық интерфейсті ұсынады.
Ойлан Фасад кейбір күрделі ішкі жүйелер үшін қарапайым адаптер ретінде. Facade
бір сынып ішінде күрделілікті оқшаулайды және басқа қолданба кодын қарапайым интерфейсті пайдалануға мүмкіндік береді.
Бұл мысалда, Facade
YouTube API және FFmpeg кітапханасының күрделілігін клиент кодынан жасырады. Клиент ондаған сыныптармен жұмыс істеудің орнына 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
Veeam ұсынған Coveware кибербопсалау оқиғаларына жауап беру қызметтерін көрсетуді жалғастырады. Coveware криминалистикалық және қалпына келтіру мүмкіндіктерін ұсынады ...
Болжалды техникалық қызмет көрсету зауытты басқаруға инновациялық және белсенді көзқараспен мұнай және газ секторында төңкеріс жасайды.…
Ұлыбританияның CMA жасанды интеллект нарығындағы Big Tech әрекеті туралы ескерту жасады. Ана жерде…
Ғимараттардың энергия тиімділігін арттыру үшін Еуропалық Одақ тұжырымдаған «Жасыл үйлер» жарлығы өзінің заң шығару процесін аяқтады ...