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 Composite 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
- Định nghĩa các lớp vô hướng / nguyên thủy và các lớp vectơ / vùng chứa
- Tạo một “giao diện” (mẫu số chung thấp nhất) có thể làm cho tất cả các lớp cụ thể “có thể hoán đổi cho nhau”
- Tất cả các lớp cụ thể khai báo một mối quan hệ “là một” cho giao diện
- Tất cả các lớp “vùng chứa” tự ghép nối với giao diện (thành phần đệ quy, Composite “có” tập hợp con lên “là” hệ thống phân cấp)
- Các lớp “vùng chứa” sử dụng tính đa hình khi chúng ủy quyền cho các lớp con của chúng
Phần code
#include <iostream>
#include <vector>
using namespace std;
// 2. Create an "interface" (lowest common denominator)
class Component
{
public:
virtual void traverse() = 0;
};
class Leaf: public Component
{
// 1. Scalar class 3. "isa" relationship
int value;
public:
Leaf(int val)
{
value = val;
}
void traverse()
{
cout << value << ' ';
}
};
class Composite: public Component
{
// 1. Vector class 3. "isa" relationship
vector < Component * > children; // 4. "container" coupled to the interface
public:
// 4. "container" class coupled to the interface
void add(Component *ele)
{
children.push_back(ele);
}
void traverse()
{
for (int i = 0; i < children.size(); i++)
// 5. Use polymorphism to delegate to children
children[i]->traverse();
}
};
int main()
{
Composite containers[4];
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
containers[i].add(new Leaf(i *3+j));
for (i = 1; i < 4; i++)
containers[0].add(&(containers[i]));
for (i = 0; i < 4; i++)
{
containers[i].traverse();
cout << endl;
}
}
Kết quả:
0 1 2 3 4 5 6 7 8 9 10 11
3 4 5
6 7 8
9 10 11
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!