Thời gian đọc ước tính: 6 minuti
Mẫu thiết kế không phải là mã mà chúng ta có thể sao chép và chèn vào chương trình của mình như chúng ta có thể làm với các hàm hoặc thư viện tiêu chuẩn. Mẫu thiết kế là một khái niệm chung có khả năng giải quyết một vấn đề cụ thể. Về cơ bản là một mô hình mà các chi tiết mà chúng tôi có thể theo dõi và triển khai giải pháp phù hợp với thực tế chương trình của chúng tôi.
Mô hình thường bị nhầm lẫn với các thuật toán vì cả hai khái niệm đều mô tả các giải pháp điển hình cho một số vấn đề đã biết. Trong khi một thuật toán defiNếu luôn có một tập hợp hành động rõ ràng có thể đạt được một mục tiêu nhất định thì mô hình là mô tả giải pháp ở cấp độ cao hơn. Mã từ cùng một mô hình được áp dụng cho hai chương trình khác nhau có thể khác nhau.
Muốn làm một sự tương tự, chúng ta có thể nghĩ đến một công thức nấu ăn: cả hai đều có những bước đi rõ ràng để đạt được mục tiêu. Tuy nhiên, một mô hình giống một dự án hơn, trong đó bạn có thể xem kết quả và đặc điểm của nó là gì, nhưng thứ tự thực hiện chính xác phụ thuộc vào chúng ta là người viết mã.
Hầu hết các mẫu được mô tả rất hình thức để mọi người có thể tái tạo chúng trong nhiều ngữ cảnh. Chúng ta hãy xem bên dưới các yếu tố có trong phần mô tả của một mô hình:
Một lập trình viên có thể phát triển phần mềm mà không cần biết đến sự tồn tại của các mẫu thiết kế. Nhiều người làm như vậy và vì lý do này mà họ thực hiện một số kế hoạch mà không hề biết. Nhưng tại sao chúng ta lại phải dành thời gian tìm hiểu chúng?
Các mẫu thiết kế khác nhau về độ phức tạp, mức độ chi tiết và quy mô ứng dụng trong toàn bộ hệ thống được thiết kế.
Bằng cách tương tự, chúng ta có thể làm cho một giao lộ an toàn hơn bằng cách lắp đặt một vài đèn giao thông hoặc xây dựng toàn bộ nút giao thông nhiều tầng với lối đi ngầm dành cho người đi bộ.
Các mô hình cấp thấp, cơ bản nhất thường được gọi là thành ngữ . Chúng thường chỉ áp dụng cho một ngôn ngữ lập trình duy nhất.
Các mô hình phổ quát và cấp cao nhất là mô hình kiến trúc . Các nhà phát triển có thể triển khai các mẫu này bằng hầu hết mọi ngôn ngữ. Không giống như các mẫu khác, chúng có thể được sử dụng để thiết kế kiến trúc của toàn bộ ứng dụng.
Hơn nữa, tất cả các mô hình có thể được phân loại theo đã thử hoặc mục đích. Ba lớp chính là:
Mặt tiền là một mẫu thiết kế cấu trúc cung cấp giao diện đơn giản hóa cho thư viện, khung hoặc bất kỳ tập hợp lớp phức tạp nào khác.
Giả sử chúng ta cần làm cho phần mềm hoạt động được, dựa trên một tập hợp lớn các đối tượng thuộc một thư viện hoặc khung công tác phức tạp. Thông thường, chúng ta sẽ cần khởi tạo tất cả các đối tượng này, theo dõi các phần phụ thuộc, thực thi các phương thức theo đúng thứ tự, v.v.
Do đó, logic nghiệp vụ của các lớp sẽ trở nên gắn kết chặt chẽ với chi tiết triển khai của các lớp bên thứ ba, khiến chúng khó hiểu và khó quản lý.
một facade
là lớp cung cấp giao diện đơn giản cho một hệ thống con phức tạp chứa nhiều bộ phận chuyển động. MỘT facade
có thể cung cấp chức năng hạn chế so với làm việc trực tiếp với hệ thống con. Tuy nhiên, nó chỉ bao gồm những tính năng mà khách hàng thực sự quan tâm.
Có một facade
nó rất hữu ích khi chúng ta cần tích hợp ứng dụng với một thư viện phức tạp có hàng tá tính năng nhưng chúng ta chỉ cần một phần nhỏ chức năng của nó.
Ví dụ: một ứng dụng tải các video ngắn vui nhộn về mèo lên mạng xã hội có thể sử dụng thư viện chuyển đổi video chuyên nghiệp. Tuy nhiên, tất cả những gì chúng ta thực sự cần là một lớp với một phương thức duy nhất encode(filename, format)
. Sau khi tạo một lớp như vậy và kết nối nó với thư viện chuyển đổi video, chúng ta sẽ có lớp đầu tiên facade
.
Ví dụ, người điều hành điện thoại của một trung tâm cuộc gọi giống như một facade
. Trên thực tế, khi chúng ta gọi đến dịch vụ điện thoại của một cửa hàng để đặt hàng qua điện thoại, người điều hành là của chúng ta. facade
đối với tất cả các dịch vụ và bộ phận của cửa hàng. Nhà điều hành cung cấp giao diện giọng nói đơn giản cho hệ thống đặt hàng, cổng thanh toán và các dịch vụ giao hàng khác nhau.
Nghĩ về Mặt tiền như một bộ chuyển đổi đơn giản cho một số hệ thống con phức tạp. Facade
tách biệt sự phức tạp trong một lớp duy nhất và cho phép mã ứng dụng khác sử dụng giao diện đơn giản.
Trong ví dụ này, Facade
che giấu sự phức tạp của thư viện API YouTube và FFmpeg khỏi mã máy khách. Thay vì làm việc với hàng tá lớp, máy khách sử dụng một phương thức đơn giản trên 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
Một ca phẫu thuật tạo hình mắt bằng cách sử dụng trình xem thương mại Apple Vision Pro đã được thực hiện tại Phòng khám đa khoa Catania…
Phát triển kỹ năng vận động tinh thông qua tô màu giúp trẻ chuẩn bị cho những kỹ năng phức tạp hơn như viết. Để tô màu…
Ngành hải quân là một cường quốc kinh tế toàn cầu thực sự, đang hướng tới thị trường 150 tỷ...
Thứ Hai tuần trước, Financial Times đã công bố một thỏa thuận với OpenAI. FT cấp phép cho hoạt động báo chí đẳng cấp thế giới…