Nội dung
Facade là một mẫu thiết kế cấu trúc cung cấp một giao diện đơn giản (nhưng có giới hạn) cho một hệ thống phức tạp gồm các lớp, thư viện hoặc framework.
Trong khi Facade giảm độ phức tạp tổng thể của ứng dụng, nó cũng giúp chuyển các phần phụ thuộc không mong muốn đến một nơi.
Cách sử dụng mẫu
Sử dụng: Mẫu Facade thường được sử dụng trong các ứng dụng được viết bằng C++. Nó đặc biệt hữu ích khi làm việc với các thư viện và API phức tạp.
Nhận dạng: Facade có thể được nhận dạng trong một lớp có giao diện đơn giản, nhưng ủy quyền hầu hết công việc cho các lớp khác. Thông thường, các facade quản lý toàn bộ vòng đời của các đối tượng mà chúng sử dụng.
Chương trình mẫu
main.cpp
/**
* Subsystem có thể chấp nhận các yêu cầu từ mặt tiền hoặc trực tiếp từ client.
* Trong mọi trường hợp, đối với Subsystem, Facade vẫn là một ứng dụng
* khách khác và nó không phải là một phần của Subsystem.
*/
class Subsystem1 {
public:
std::string Operation1() const {
return "Subsystem1: Ready!\n";
}
// ...
std::string OperationN() const {
return "Subsystem1: Go!\n";
}
};
/**
* Một số facade có thể hoạt động với nhiều hệ thống con cùng một lúc.
*/
class Subsystem2 {
public:
std::string Operation1() const {
return "Subsystem2: Get ready!\n";
}
// ...
std::string OperationZ() const {
return "Subsystem2: Fire!\n";
}
};
/**
* Lớp Facade cung cấp một giao diện đơn giản cho logic phức tạp của một
* hoặc một số hệ thống con. Facade ủy quyền yêu cầu của client cho các đối
* tượng thích hợp trong hệ thống con. Facade cũng chịu trách nhiệm quản lý
* vòng đời của chúng. Tất cả điều này bảo vệ client khỏi sự phức tạp không
* mong muốn của hệ thống con.
*/
class Facade {
protected:
Subsystem1 *subsystem1_;
Subsystem2 *subsystem2_;
/**
* Tùy thuộc vào nhu cầu của ứng dụng, bạn có thể cung cấp cho Facade
* các đối tượng hệ thống con hiện có hoặc buộc Facade tự tạo chúng.
*/
public:
/**
* Trong trường hợp này, chúng ta sẽ ủy quyền quyền sở hữu bộ nhớ cho Facade
*/
Facade(
Subsystem1 *subsystem1 = nullptr,
Subsystem2 *subsystem2 = nullptr) {
this->subsystem1_ = subsystem1 ?: new Subsystem1;
this->subsystem2_ = subsystem2 ?: new Subsystem2;
}
~Facade() {
delete subsystem1_;
delete subsystem2_;
}
/**
* Các phương thức của Facade là những lối tắt thuận tiện cho chức năng
* phức tạp của các hệ thống con. Tuy nhiên, client chỉ nhận được một
* phần nhỏ khả năng của hệ thống con.
*/
std::string Operation() {
std::string result = "Facade initializes subsystems:\n";
result += this->subsystem1_->Operation1();
result += this->subsystem2_->Operation1();
result += "Facade orders subsystems to perform the action:\n";
result += this->subsystem1_->OperationN();
result += this->subsystem2_->OperationZ();
return result;
}
};
/**
* Client hoạt động với các hệ thống con phức tạp thông qua một giao diện đơn
* giản do Facade cung cấp. Khi một Facade quản lý vòng đời của hệ thống con,
* client thậm chí có thể không biết về sự tồn tại của hệ thống con. Cách tiếp cận
* này cho phép bạn kiểm soát mức độ phức tạp.
*/
void ClientCode(Facade *facade) {
// ...
std::cout << facade->Operation();
// ...
}
/**
* Client có thể có một số đối tượng của hệ thống con đã được tạo. Trong
* trường hợp này, có thể đáng giá khi khởi tạo Facade bằng những đối
* tượng này thay vì để Facade tạo các thể hiện mới.
*/
int main() {
Subsystem1 *subsystem1 = new Subsystem1;
Subsystem2 *subsystem2 = new Subsystem2;
Facade *facade = new Facade(subsystem1, subsystem2);
ClientCode(facade);
delete facade;
return 0;
}
Kết quả
Facade initializes subsystems:
Subsystem1: Ready!
Subsystem2: Get ready!
Facade orders subsystems to perform the action:
Subsystem1: Go!
Subsystem2: Fire!
Để lại một bình luận