زمان تخمینی مطالعه: 6 minuti
الگوی طراحی کدی نیست که بتوانیم آن را کپی کرده و در برنامه خود وارد کنیم، همانطور که می توانیم با توابع یا کتابخانه های استاندارد انجام دهیم. الگوی طراحی یک مفهوم کلی است که قادر به حل یک مشکل خاص است. اساساً مدلی که جزئیات آن را می توانیم دنبال کرده و راه حلی متناسب با واقعیت برنامه خود اجرا کنیم.
مدلها اغلب با الگوریتمها اشتباه گرفته میشوند، زیرا هر دو مفهوم راهحلهای معمولی برای برخی مسائل شناخته شده را توصیف میکنند. در حالی که یک الگوریتم defiاگر همیشه مجموعه ای واضح از اقدامات وجود داشته باشد که بتواند به یک هدف خاص دست یابد، یک مدل توصیف سطح بالاتری از یک راه حل است. کدهای یک مدل اعمال شده برای دو برنامه مختلف ممکن است متفاوت باشند.
اگر بخواهیم یک قیاس انجام دهیم، می توانیم به یک دستور پخت فکر کنیم: هر دو گام های روشنی برای رسیدن به یک هدف دارند. با این حال، یک مدل بیشتر شبیه یک پروژه است که می توانید ببینید نتیجه و ویژگی های آن چیست، اما ترتیب دقیق پیاده سازی به ما بستگی دارد که کد را می نویسیم.
بیشتر الگوها بسیار رسمی توصیف شده اند تا مردم بتوانند آنها را در زمینه های مختلف بازتولید کنند. بیایید در زیر عناصری را که در توضیح یک مدل وجود دارد، ببینیم:
یک برنامه نویس می تواند بدون اطلاع از وجود الگوهای طراحی نرم افزار توسعه دهد. بسیاری این کار را انجام می دهند و به همین دلیل بدون اینکه بدانند برخی از طرح ها را اجرا می کنند. اما پس چرا باید برای یادگیری آنها وقت بگذاریم؟
الگوهای طراحی در پیچیدگی، سطح جزئیات و مقیاس کاربرد در سراسر سیستم طراحی شده متفاوت است.
به قیاس، میتوانیم با نصب چند چراغ راهنمایی یا ایجاد یک تقاطع چندسطحی با معابر زیرزمینی برای عابران پیاده، یک تقاطع را ایمنتر کنیم.
ابتدایی ترین مدل های سطح پایین اغلب نامیده می شوند اصطلاحات . آنها معمولا فقط برای یک زبان برنامه نویسی اعمال می شوند.
جهانی ترین و سطح بالا ترین مدل ها هستند مدل های معماری . توسعه دهندگان می توانند این الگوها را تقریباً در هر زبانی پیاده سازی کنند. بر خلاف سایر الگوها، می توان از آنها برای طراحی معماری کل برنامه استفاده کرد.
علاوه بر این، همه مدل ها را می توان بر اساس آنها طبقه بندی کرد تلاش کرد یا هدف سه کلاس اصلی عبارتند از:
نما یک الگوی طراحی ساختاری است که یک رابط ساده برای یک کتابخانه، چارچوب یا هر مجموعه پیچیده دیگری از کلاس ها ارائه می دهد.
بیایید فرض کنیم که باید نرم افزار را بر اساس مجموعه بزرگی از اشیاء که به یک کتابخانه یا چارچوب پیچیده تعلق دارند، کار کنیم. به طور معمول، ما باید تمام این اشیاء را مقداردهی اولیه کنیم، وابستگی ها را پیگیری کنیم، متدها را به ترتیب صحیح اجرا کنیم و غیره.
در نتیجه، منطق تجاری کلاسها به شدت با جزئیات پیادهسازی کلاسهای شخص ثالث مرتبط میشود و درک و مدیریت آنها را دشوار میکند.
الف facade
کلاسی است که یک رابط ساده برای یک زیرسیستم پیچیده که شامل بسیاری از قطعات متحرک است فراهم می کند. آ facade
ممکن است عملکرد محدودی را در مقایسه با کار مستقیم با زیرسیستم ارائه دهد. با این حال، فقط شامل ویژگی هایی است که مشتریان واقعاً به آنها اهمیت می دهند.
یکی داشته باش facade
زمانی مفید است که ما نیاز به ادغام برنامه با کتابخانه پیچیده ای داریم که ده ها ویژگی دارد، اما فقط به بخش کوچکی از عملکرد آن نیاز داریم.
برای مثال، برنامهای که ویدیوهای خندهدار کوتاه با گربهها را در رسانههای اجتماعی آپلود میکند، میتواند به طور بالقوه از یک کتابخانه حرفهای تبدیل ویدیو استفاده کند. با این حال، تنها چیزی که واقعاً به آن نیاز داریم یک کلاس با متد واحد است encode(filename, format)
. پس از ایجاد چنین کلاسی و اتصال آن به کتابخانه تبدیل ویدیو، اولین کلاس خود را خواهیم داشت facade
.
به عنوان مثال اپراتور تلفن یک مرکز تماس مانند a 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
Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیتهای پزشکی قانونی و اصلاحی را ارائه میدهد…
تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…
CMA انگلستان در مورد رفتار Big Tech در بازار هوش مصنوعی هشداری صادر کرده است. آنجا…
فرمان "خانه های سبز" که توسط اتحادیه اروپا برای افزایش بهره وری انرژی ساختمان ها تدوین شده است، روند قانونی خود را با…