עסטימאַטעד לייענען צייט: 6 minuti
א פּלאַן מוסטער איז נישט קאָד וואָס מיר קענען נאָכמאַכן און אַרייַנלייגן אין אונדזער פּראָגראַם, ווי מיר קענען טאָן מיט נאָרמאַל פאַנגקשאַנז אָדער לייברעריז. דער פּלאַן מוסטער איז אַ גענעראַל באַגריף וואָס איז ביכולת צו סאַלווינג אַ באַזונדער פּראָבלעם. בייסיקלי אַ מאָדעל וועמענס דעטאַילס מיר קענען נאָכגיין און ינסטרומענט אַ לייזונג וואָס פיץ די פאַקט פון אונדזער פּראָגראַם.
מאָדעלס זענען אָפט צעמישט מיט אַלגערידאַמז, ווייַל ביידע קאַנסעפּס באַשרייַבן טיפּיש סאַלושאַנז צו עטלעכע באַוווסט פּראָבלעמס. בשעת אַ אַלגערידאַם defiאויב עס איז שטענדיק אַ קלאָר גאַנג פון אַקשאַנז וואָס קענען דערגרייכן אַ זיכער ציל, אַ מאָדעל איז אַ העכער מדרגה באַשרייַבונג פון אַ לייזונג. קאָד פון דער זעלביקער מאָדעל געווענדט צו צוויי פאַרשידענע מגילה קען זיין אַנדערש.
ווילן צו מאַכן אַן אַנאַלאַדזשי, מיר קענען טראַכטן פון אַ קוקינג רעצעפּט: ביידע האָבן קלאָר טריט צו דערגרייכן אַ ציל. אָבער, אַ מאָדעל איז מער ווי אַ פּרויעקט, פון וואָס איר קענען זען וואָס די רעזולטאַט און זייַן קעראַקטעריסטיקס זענען, אָבער די פּינטלעך סדר פון ימפּלאַמענטיישאַן דעפּענדס אויף אונדז וואס שרייַבן דעם קאָד.
רובֿ פּאַטערנז זענען דיסקרייבד זייער פאָרמאַלי אַזוי אַז מענטשן קענען רעפּראָדוצירן זיי אין פילע קאַנטעקסץ. לאָמיר זען אונטן די יסודות וואָס זענען פאָרשטעלן אין די באַשרייַבונג פון אַ מאָדעל:
א פּראָגראַמיסט קענען אַנטוויקלען ווייכווארג אָן וויסן די עקזיסטענץ פון פּלאַן פּאַטערנז. פילע טאָן, און פֿאַר דעם סיבה זיי ינסטרומענט עטלעכע סקימז אָן געוואוסט עס. אָבער וואָס זאָל מיר פאַרברענגען צייט צו לערנען זיי?
פּלאַן פּאַטערנז אַנדערש אין קאַמפּלעקסיטי, מדרגה פון דעטאַל און וואָג פון אָנווענדלעך אין די דיזיינד סיסטעם.
לויט אַנאַלאַדזשי, מיר קענען מאַכן אַ ינטערסעקשאַן סאַפער דורך ינסטאָלינג עטלעכע פאַרקער לייץ אָדער בויען אַ גאַנץ מולטילעוועל ויסבייַט מיט ונטערערד פּאַסידזשיז פֿאַר פּאַדעסטריאַנז.
די מערסט יקערדיק, נידעריק-מדרגה מאָדעלס זענען אָפט גערופן אידיאָמען . זיי יוזשאַוואַלי אַפּלייז בלויז צו אַ איין פּראָגראַממינג שפּראַך.
די מערסט וניווערסאַל און הויך-מדרגה מאָדעלס זענען אַרקאַטעקטשעראַל מאָדעלס . דעוועלאָפּערס קענען ינסטרומענט די פּאַטערנז אין כמעט קיין שפּראַך. ניט ענלעך אנדערע פּאַטערנז, זיי קענען זיין געוויינט צו פּלאַן די אַרקאַטעקטשער פון אַ גאַנץ אַפּלאַקיישאַן.
דערצו, אַלע מאָדעלס קענען זיין קלאַסאַפייד לויט זייער געפרואווט אָדער ציל. די דריי הויפּט קלאסן זענען:
פאַקאַדע איז אַ סטראַקטשעראַל פּלאַן מוסטער וואָס גיט אַ סימפּלאַפייד צובינד צו אַ ביבליאָטעק, פריימווערק אָדער קיין אנדערע קאָמפּלעקס גאַנג פון קלאסן.
לאָמיר יבערנעמען מיר דאַרפֿן צו מאַכן ווייכווארג אַרבעט, באזירט אויף אַ גרויס גאַנג פון אַבדזשעקץ וואָס געהערן צו אַ סאַפיסטאַקייטיד ביבליאָטעק אָדער פריימווערק. נאָרמאַללי, מיר וואָלט דאַרפֿן צו ינישאַלייז אַלע די אַבדזשעקץ, האַלטן שפּור פון דיפּענדאַנסיז, ויספירן מעטהאָדס אין די ריכטיק סדר, און אַזוי אויף.
ווי אַ רעזולטאַט, די געשעפט לאָגיק פון די קלאסן וואָלט זיין טייטלי קאַפּאַלד מיט די ימפּלאַמענטיישאַן דעטאַילס פון דריט-פּאַרטיי קלאסן, מאכן זיי שווער צו פֿאַרשטיין און פירן.
א facade
איז אַ קלאַס וואָס גיט אַ פּשוט צובינד צו אַ קאָמפּלעקס סאַבסיסטעם וואָס כּולל פילע מאָווינג טיילן. א facade
קען צושטעלן לימיטעד פאַנגקשאַנאַליטי קאַמפּערד מיט ארבעטן גלייַך מיט די סאַבסיסטאַם. אָבער, עס כולל בלויז די פֿעיִקייטן וואָס קאַסטאַמערז טאַקע זאָרגן וועגן.
האָבן איין facade
עס איז נוציק ווען מיר דאַרפֿן צו ויסשטימען די אַפּ מיט אַ סאַפיסטאַקייטיד ביבליאָטעק וואָס האט דאַזאַנז פון פֿעיִקייטן, אָבער מיר דאַרפֿן בלויז אַ קליין טייל פון זייַן פאַנגקשאַנאַליטי.
פֿאַר בייַשפּיל, אַ אַפּ וואָס ופּלאָאַדס קורץ מאָדנע ווידיאס מיט קאַץ צו געזעלשאַפטלעך מידיאַ קען פּאַטענטשאַלי נוצן אַ פאַכמאַן ווידעא קאַנווערזשאַן ביבליאָטעק. אָבער, אַלע מיר טאַקע דאַרפֿן איז אַ קלאַס מיט די איין אופֿן encode(filename, format)
. נאָך קריייטינג אַזאַ אַ קלאַס און קאַנעקטינג עס צו די ווידעא קאַנווערזשאַן ביבליאָטעק, מיר וועלן האָבן אונדזער ערשטער facade
.
פֿאַר בייַשפּיל, דער טעלעפאָן אָפּעראַטאָר פון אַ רופן צענטער איז ווי אַ facade
. אין פאַקט, ווען מיר רופן אַ קראָם ס טעלעפאָן דינסט צו שטעלן אַ טעלעפאָן סדר, אַן אָפּעראַטאָר איז אונדזער facade
צו אַלע די סערוויסעס און דיפּאַרטמאַנץ פון די קראָם. דער אָפּעראַטאָר גיט אַ פּשוט קול צובינד צו די אָרדערינג סיסטעם, צאָלונג גייטווייז און פאַרשידן עקספּרעס באַדינונגס.
טראכט וועגן פאַקאַדע ווי אַ פּשוט אַדאַפּטער פֿאַר עטלעכע קאָמפּלעקס סאַבסיסטאַמז. Facade
יזאָלייץ די קאַמפּלעקסיטי אין אַ איין קלאַס און אַלאַוז אנדערע אַפּלאַקיישאַן קאָד צו נוצן די פּשוט צובינד.
אין דעם בייַשפּיל, Facade
כיידז די קאַמפּלעקסיטי פון די YouTube API און FFmpeg ביבליאָטעק פֿון דעם קליענט קאָד. אַנשטאָט צו אַרבעטן מיט דאַזאַנז פון קלאסן, דער קליענט ניצט אַ פּשוט אופֿן אויף פאַסאַד.
<?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 וועט פאָרזעצן צו צושטעלן ענטפער באַדינונגס פֿאַר סייבער יקסטאָרשאַן אינצידענט. קאָוועוואַרע וועט פאָרשלאָגן פאָרענסיקס און רימעדייישאַן קייפּאַבילאַטיז ...
פּרידיקטיוו וישאַלט איז רעוואַלושאַנייזינג די ייל & גאַז סעקטאָר, מיט אַן ינאַווייטיוו און פּראָואַקטיוו צוגאַנג צו פאַבריק פאַרוואַלטונג.…
די UK CMA האט ארויס אַ ווארענונג וועגן ביג טעק ס נאַטור אין די קינסטלעך סייכל מאַרק. דאָרט…
די "קאַסע גרין" דעקרעט, פארמולירט דורך די אייראפעישע יוניאַן צו פאַרבעסערן די ענערגיע עפעקטיווקייַט פון בנינים, האט פארענדיקט זיין לעגיסלאַטיווע פּראָצעס מיט ...