Nội dung
Adapter là một mẫu thiết kế cấu trúc, cho phép các đối tượng không tương thích cộng tác.
Adapter hoạt động như một trình bao bọc giữa hai đối tượng. Nó bắt các lời gọi cho một đối tượng và chuyển đổi chúng sang định dạng và giao diện có thể nhận ra bởi đối tượng thứ hai.
Cách sử dụng mẫu
Sử dụng: Mẫu Adapter khá phổ biến trong chương trình C++. Nó rất thường được sử dụng trong các hệ thống dựa trên một số mã cũ. Trong những trường hợp như vậy, Adapter làm cho các mã cũ tương tác với các lớp hiện đại.
Nhận dạng: Adapter có thể nhận biết được bởi một phương thức khởi tạo lấy một thể hiện của một kiểu giao diện / trừu tượng khác. Khi adapter nhận được lời gọi đến bất kỳ phương thức nào của nó, nó sẽ dịch các tham số sang định dạng thích hợp và sau đó chuyển hướng lời gọi đến một hoặc một số phương thức của đối tượng được bao bọc.
Chương trình mẫu
main.cpp
/**
* Target xác định giao diện cụ thể được client sử dụng.
*/
class Target {
public:
virtual ~Target() = default;
virtual std::string Request() const {
return "Target: The default target's behavior.";
}
};
/**
* Adaptee chứa một số hành vi hữu ích, nhưng giao diện của nó không tương thích
* với client hiện có. Nó cần một số điều chỉnh trước khi client có thể sử dụng nó.
*/
class Adaptee {
public:
std::string SpecificRequest() const {
return ".eetpadA eht fo roivaheb laicepS";
}
};
/**
* Adapter làm cho giao diện của Adaptee tương thích với giao diện của Target.
*/
class Adapter : public Target {
private:
Adaptee *adaptee_;
public:
Adapter(Adaptee *adaptee) : adaptee_(adaptee) {}
std::string Request() const override {
std::string to_reverse = this->adaptee_->SpecificRequest();
std::reverse(to_reverse.begin(), to_reverse.end());
return "Adapter: (TRANSLATED) " + to_reverse;
}
};
/**
* Client hỗ trợ tất cả các lớp tuân theo giao diện Target.
*/
void ClientCode(const Target *target) {
std::cout << target->Request();
}
int main() {
std::cout << "Client: I can work just fine with the Target objects:\n";
Target *target = new Target;
ClientCode(target);
std::cout << "\n\n";
Adaptee *adaptee = new Adaptee;
std::cout << "Client: The Adaptee class has a weird interface. See, I don't understand it:\n";
std::cout << "Adaptee: " << adaptee->SpecificRequest();
std::cout << "\n\n";
std::cout << "Client: But I can work with it via the Adapter:\n";
Adapter *adapter = new Adapter(adaptee);
ClientCode(adapter);
std::cout << "\n";
delete target;
delete adaptee;
delete adapter;
return 0;
}
Kết quả:
Client: I can work just fine with the Target objects:
Target: The default target's behavior.
Client: The Adaptee class has a weird interface. See, I don't understand it:
Adaptee: .eetpadA eht fo roivaheb laicepS
Client: But I can work with it via the Adapter:
Adapter: (TRANSLATED) Special behavior of the Adaptee.
Để lại một bình luận