Qua các series tự học về Design Pattern, Hôm nay cafedevn chia sẻ cho ace ví dụ và code cụ thể về cách sử dụng Decorator design pattern với ngôn ngữ lập trình C++. Nhằm giúp ace hiểu rõ cách sử Pattern này với C++ một cách nhanh nhất và áp dụng nó vào thực tế.
Nội dung chính
Mô tả code
- Tạo “mẫu số chung” giúp các lớp có thể hoán đổi cho nhau
- Tạo một lớp cơ sở cấp hai cho chức năng tùy chọn
- Lớp “Core” và lớp “Decorator” khai báo một mối quan hệ “isa”
- Lớp Decorator “có” một thể hiện của “mẫu số chung thấp nhất”
- Lớp trang trí ủy quyền cho “có một” đối tượng
- Tạo một lớp dẫn xuất Decorator cho mỗi phần trang trí tùy chọn
- Các lớp dẫn xuất của Decorator ủy quyền cho lớp cơ sở AND thêm nội dung bổ sung
- Khách hàng có trách nhiệm soạn các cấu hình mong muốn
Phần code
#include <iostream>
using namespace std;
// 1. "lowest common denominator"
class Widget
{
public:
virtual void draw() = 0;
};
class TextField: public Widget
{
// 3. "Core" class & "is a"
int width, height;
public:
TextField(int w, int h)
{
width = w;
height = h;
}
/*virtual*/
void draw()
{
cout << "TextField: " << width << ", " << height << '\n';
}
};
// 2. 2nd level base class
class Decorator: public Widget // 4. "is a" relationship
{
Widget *wid; // 4. "has a" relationship
public:
Decorator(Widget *w)
{
wid = w;
}
/*virtual*/
void draw()
{
wid->draw(); // 5. Delegation
}
};
class BorderDecorator: public Decorator
{
public:
// 6. Optional embellishment
BorderDecorator(Widget *w): Decorator(w){}
/*virtual*/
void draw()
{
// 7. Delegate to base class and add extra stuff
Decorator::draw();
cout << " BorderDecorator" << '\n';
}
};
class ScrollDecorator: public Decorator
{
public:
// 6. Optional embellishment
ScrollDecorator(Widget *w): Decorator(w){}
/*virtual*/
void draw()
{
// 7. Delegate to base class and add extra stuff
Decorator::draw();
cout << " ScrollDecorator" << '\n';
}
};
int main()
{
// 8. Client has the responsibility to compose desired configurations
Widget *aWidget = new BorderDecorator(new BorderDecorator(new ScrollDecorator
(new TextField(80, 24))));
aWidget->draw();
}
Kết quả:
TextField: 80, 24
ScrollDecorator
BorderDecorator
BorderDecorator
Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.
Tài liệu từ cafedev:
- Full series tự học Design Pattern từ cơ bản tới nâng cao tại đây nha.
- Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!