ເວລາອ່ານໂດຍປະມານ: 6 ນາທີ
ຮູບແບບການອອກແບບບໍ່ແມ່ນລະຫັດທີ່ພວກເຮົາສາມາດຄັດລອກແລະໃສ່ໃນໂປຼແກຼມຂອງພວກເຮົາ, ດັ່ງທີ່ພວກເຮົາສາມາດເຮັດໄດ້ດ້ວຍຫນ້າທີ່ມາດຕະຖານຫຼືຫ້ອງສະຫມຸດ. ຮູບແບບການອອກແບບແມ່ນແນວຄວາມຄິດທົ່ວໄປທີ່ສາມາດແກ້ໄຂບັນຫາໂດຍສະເພາະ. ໂດຍພື້ນຖານແລ້ວແມ່ນຕົວແບບທີ່ມີລາຍລະອຽດທີ່ພວກເຮົາສາມາດປະຕິບັດຕາມ ແລະປະຕິບັດການແກ້ໄຂທີ່ເໝາະສົມກັບຄວາມເປັນຈິງຂອງໂຄງການຂອງພວກເຮົາ.
ແບບຈໍາລອງມັກຈະສັບສົນກັບ algorithms, ເພາະວ່າແນວຄວາມຄິດທັງສອງອະທິບາຍວິທີການແກ້ໄຂບັນຫາທົ່ວໄປບາງຢ່າງ. ໃນຂະນະທີ່ສູດການຄິດໄລ່ defiຖ້າມີການກໍານົດການກະທໍາທີ່ຊັດເຈນສະເຫມີທີ່ສາມາດບັນລຸເປົ້າຫມາຍທີ່ແນ່ນອນ, ຮູບແບບແມ່ນຄໍາອະທິບາຍໃນລະດັບທີ່ສູງກວ່າຂອງການແກ້ໄຂ. ລະຫັດຈາກຕົວແບບດຽວກັນທີ່ໃຊ້ກັບສອງໂຄງການທີ່ແຕກຕ່າງກັນອາດຈະແຕກຕ່າງກັນ.
ຕ້ອງການເຮັດການປຽບທຽບ, ພວກເຮົາສາມາດຄິດເຖິງສູດປຸງແຕ່ງອາຫານ: ທັງສອງມີຂັ້ນຕອນທີ່ຊັດເຈນເພື່ອບັນລຸເປົ້າຫມາຍ. ຢ່າງໃດກໍ່ຕາມ, ຮູບແບບແມ່ນຄ້າຍຄືກັບໂຄງການ, ເຊິ່ງທ່ານສາມາດເຫັນໄດ້ວ່າຜົນໄດ້ຮັບແລະຄຸນລັກສະນະຂອງມັນແມ່ນຫຍັງ, ແຕ່ຄໍາສັ່ງທີ່ແນ່ນອນຂອງການປະຕິບັດແມ່ນຂຶ້ນກັບພວກເຮົາທີ່ຂຽນລະຫັດ.
ຮູບແບບສ່ວນໃຫຍ່ຖືກອະທິບາຍຢ່າງເປັນທາງການເພື່ອໃຫ້ຄົນສາມາດຜະລິດພວກມັນໄດ້ໃນຫຼາຍສະພາບການ. ໃຫ້ເບິ່ງຂ້າງລຸ່ມນີ້ອົງປະກອບທີ່ມີຢູ່ໃນຄໍາອະທິບາຍຂອງຕົວແບບ:
ຜູ້ຂຽນໂປລແກລມສາມາດພັດທະນາຊອບແວໄດ້ໂດຍບໍ່ຮູ້ເຖິງການມີຢູ່ຂອງຮູບແບບການອອກແບບ. ຫຼາຍຄົນເຮັດ, ແລະດ້ວຍເຫດຜົນນີ້, ພວກເຂົາປະຕິບັດບາງໂຄງການໂດຍບໍ່ຮູ້ຕົວ. ແຕ່ແລ້ວເປັນຫຍັງເຮົາຄວນໃຊ້ເວລາເພື່ອຮຽນຮູ້ເຂົາເຈົ້າ?
ຮູບແບບການອອກແບບແຕກຕ່າງກັນໃນຄວາມສັບສົນ, ລະດັບຂອງລາຍລະອຽດ, ແລະຂະຫນາດຂອງການນໍາໃຊ້ໃນທົ່ວລະບົບການອອກແບບ.
ໂດຍການປຽບທຽບ, ພວກເຮົາສາມາດເຮັດໃຫ້ທາງແຍກມີຄວາມປອດໄພກວ່າໂດຍການຕິດຕັ້ງໄຟຈາລະຈອນຈໍານວນຫນ້ອຍຫນຶ່ງຫຼືການກໍ່ສ້າງທາງແຍກຫຼາຍລະດັບທັງຫມົດກັບທາງໃຕ້ດິນສໍາລັບຄົນຍ່າງ.
ແບບພື້ນຖານທີ່ສຸດ, ລະດັບຕ່ໍາແມ່ນມັກຈະເອີ້ນວ່າ ສຳນວນ . ປົກກະຕິແລ້ວພວກມັນໃຊ້ກັບພາສາການຂຽນໂປຼແກຼມດຽວເທົ່ານັ້ນ.
ຮູບແບບທົ່ວໄປທີ່ສຸດແລະລະດັບສູງແມ່ນ ຮູບແບບສະຖາປັດຕະຍະກໍາ . ນັກພັດທະນາສາມາດປະຕິບັດຮູບແບບເຫຼົ່ານີ້ໃນເກືອບທຸກພາສາ. ບໍ່ເຫມືອນກັບຮູບແບບອື່ນໆ, ພວກເຂົາສາມາດຖືກນໍາໃຊ້ເພື່ອອອກແບບສະຖາປັດຕະຍະກໍາຂອງຄໍາຮ້ອງສະຫມັກທັງຫມົດ.
ນອກຈາກນັ້ນ, ຮູບແບບທັງຫມົດສາມາດຖືກຈັດປະເພດຕາມຮູບແບບຂອງພວກເຂົາ ພະຍາຍາມ ຫຼືຈຸດປະສົງ. ສາມຊັ້ນຕົ້ນຕໍແມ່ນ:
ອຳ ນວຍຄວາມສະດວກ ແມ່ນຮູບແບບການອອກແບບໂຄງສ້າງທີ່ສະຫນອງການໂຕ້ຕອບທີ່ງ່າຍດາຍໃຫ້ກັບຫ້ອງສະຫມຸດ, ກອບ, ຫຼືຊຸດຊັ້ນຮຽນທີ່ສັບສົນອື່ນໆ.
ໃຫ້ສົມມຸດວ່າພວກເຮົາຈໍາເປັນຕ້ອງເຮັດໃຫ້ການເຮັດວຽກຂອງຊອບແວ, ອີງໃສ່ຊຸດຂະຫນາດໃຫຍ່ຂອງວັດຖຸທີ່ເປັນຂອງຫ້ອງສະຫມຸດຫຼືກອບທີ່ຊັບຊ້ອນ. ໂດຍປົກກະຕິ, ພວກເຮົາຈະຕ້ອງເລີ່ມຕົ້ນວັດຖຸເຫຼົ່ານີ້ທັງຫມົດ, ຕິດຕາມການເພິ່ງພາອາໄສ, ປະຕິບັດວິທີການໃນຄໍາສັ່ງທີ່ຖືກຕ້ອງ, ແລະອື່ນໆ.
ດັ່ງນັ້ນ, ເຫດຜົນທາງທຸລະກິດຂອງຫ້ອງຮຽນຈະກາຍເປັນຄູ່ກັນຢ່າງແຫນ້ນຫນາກັບລາຍລະອຽດການປະຕິບັດຂອງຊັ້ນຮຽນຂອງບຸກຄົນທີສາມ, ເຮັດໃຫ້ມັນຍາກທີ່ຈະເຂົ້າໃຈແລະການຄຸ້ມຄອງ.
Una facade
ແມ່ນຫ້ອງຮຽນທີ່ສະຫນອງການໂຕ້ຕອບງ່າຍດາຍກັບລະບົບຍ່ອຍສະລັບສັບຊ້ອນທີ່ປະກອບດ້ວຍຫຼາຍພາກສ່ວນການເຄື່ອນຍ້າຍ. ກ facade
ອາດຈະສະຫນອງການເຮັດວຽກທີ່ຈໍາກັດເມື່ອທຽບກັບການເຮັດວຽກໂດຍກົງກັບລະບົບຍ່ອຍ. ຢ່າງໃດກໍ່ຕາມ, ມັນພຽງແຕ່ປະກອບມີຄຸນສົມບັດທີ່ລູກຄ້າສົນໃຈແທ້ໆ.
ມີຫນຶ່ງ facade
ມັນເປັນປະໂຫຍດໃນເວລາທີ່ພວກເຮົາຈໍາເປັນຕ້ອງໄດ້ປະສົມປະສານ app ກັບຫ້ອງສະຫມຸດທີ່ຊັບຊ້ອນທີ່ມີຫລາຍສິບລັກສະນະ, ແຕ່ພວກເຮົາຕ້ອງການພຽງແຕ່ສ່ວນຂະຫນາດນ້ອຍຂອງການເຮັດວຽກຂອງມັນ.
ຕົວຢ່າງ, ແອັບທີ່ອັບໂຫຼດວິດີໂອຕະຫຼົກສັ້ນກັບແມວໃສ່ສື່ສັງຄົມອາດຈະໃຊ້ຫ້ອງສະໝຸດການແປງວິດີໂອແບບມືອາຊີບໄດ້. ຢ່າງໃດກໍຕາມ, ທັງຫມົດທີ່ພວກເຮົາຕ້ອງການແມ່ນຫ້ອງຮຽນທີ່ມີວິທີການດຽວ encode(filename, format)
. ຫຼັງຈາກການສ້າງຫ້ອງຮຽນດັ່ງກ່າວແລະການເຊື່ອມຕໍ່ກັບຫ້ອງສະຫມຸດການປ່ຽນແປງວິດີໂອ, ພວກເຮົາຈະມີການທໍາອິດຂອງພວກເຮົາ facade
.
ຕົວຢ່າງ, ຜູ້ປະຕິບັດການໂທລະສັບຂອງສູນການໂທແມ່ນຄ້າຍຄື a facade
. ໃນຄວາມເປັນຈິງ, ເມື່ອພວກເຮົາໂທຫາບໍລິການໂທລະສັບຂອງຮ້ານເພື່ອວາງຄໍາສັ່ງໂທລະສັບ, ຜູ້ປະກອບການແມ່ນຂອງພວກເຮົາ facade
ຕໍ່ການບໍລິການ ແລະພະແນກການທັງໝົດຂອງຮ້ານ. ຜູ້ປະກອບການສະຫນອງການໂຕ້ຕອບສຽງທີ່ງ່າຍດາຍກັບລະບົບການສັ່ງຊື້, ປະຕູການຈ່າຍເງິນແລະການບໍລິການຈັດສົ່ງຕ່າງໆ.
ຄິດກ່ຽວກັບ ອຳ ນວຍຄວາມສະດວກ ເປັນຕົວດັດແປງແບບງ່າຍດາຍສໍາລັບບາງລະບົບຍ່ອຍທີ່ສັບສົນ. Facade
isolates ຄວາມຊັບຊ້ອນພາຍໃນຫ້ອງຮຽນດຽວແລະອະນຸຍາດໃຫ້ລະຫັດຄໍາຮ້ອງສະຫມັກອື່ນໆທີ່ຈະນໍາໃຊ້ການໂຕ້ຕອບງ່າຍດາຍ.
ໃນຕົວຢ່າງນີ້, 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 ຈະສືບຕໍ່ໃຫ້ບໍລິການຕອບໂຕ້ເຫດການ extortion cyber. Coveware ຈະສະ ເໜີ ຄວາມສາມາດດ້ານນິຕິສາດແລະການແກ້ໄຂ…
ການຮັກສາການຄາດເດົາແມ່ນການປະຕິວັດຂະແໜງນ້ຳມັນ ແລະ ອາຍແກັສ, ດ້ວຍແນວທາງນະວັດຕະກໍາ ແລະ ຕັ້ງໜ້າໃນການຄຸ້ມຄອງພືດ.…
CMA ຂອງອັງກິດໄດ້ອອກຄໍາເຕືອນກ່ຽວກັບພຶດຕິກໍາຂອງ Big Tech ໃນຕະຫຼາດປັນຍາປະດິດ. ຢູ່ທີ່ນັ້ນ…
ດຳລັດ “Case Green” ທີ່ສ້າງຂຶ້ນໂດຍສະຫະພາບເອີລົບ ເພື່ອຍົກສູງປະສິດທິພາບດ້ານພະລັງງານຂອງຕຶກອາຄານ, ໄດ້ສິ້ນສຸດຂະບວນການນິຕິບັນຍັດຂອງຕົນດ້ວຍ…