Tôi đang học các lớp cấp thấp về hệ thống nhúng và được giao nhiệm vụ sao chép một số mẫu thiết kế trong C. Tôi có người quan sát và đại biểu đang làm việc và tôi thực sự gặp khó khăn với mẫu trang trí. Tôi nhận ra rằng nhiều người nghĩ rằng các mẫu thiết kế không thuộc về ngôn ngữ "cấp thấp" như C, nhưng tôi không có lựa chọn nào khác - lớp học cần phải được hoàn thành. Tất cả các ví dụ tôi tìm thấy đều dành cho ngôn ngữ lập trình OO. Tôi đang sử dụng ví dụ về pizza Java này làm cơ sở (chỉ trả lại chi phí để làm cho nó đơn giản) nhưng trong suốt cuộc đời tôi không thể làm cho nó hoạt động được:http://www.newthinktank.com/2012/09/design-design-potype-tutorial/
Đây là UML của ví dụ (như mình đã nói mình chỉ làm phần getCost):
Tôi đã dành khoảng 2 ngày để cố gắng làm cho nó hoạt động nhưng tôi chỉ bị mắc kẹt. Tôi đã thêm mã mình có nhưng không biết cách thêm cà chua vào pizza để cộng giá thành chính xác
#include
cấu trúc typedef _pizza {
gấp đôi (* getCost) ();
} pizza_t;
typedef struct _toppingDecorator {
gấp đôi (* getCost) ();
pizza_t tempPizza;
} toppingDecorator_t;
// đây là những chiếc pizza
đồng bằng đôiPizzaCost () {
trả lại 5;
}
dày gấp đôiCrustPizzaCost () {
trở về 7;
}
// đây là những lớp trên bề mặt
gấp đôi mozzarellaCost (toppingDecorator_t * self) {
tự trả về->tempPizza.getCost () + 3.0;
}
cà chua gấp đôiCost (toppingDecorator_t * self) {
return self->tempPizza.getCost() + 1;
}
int main(int argc, const char * argv[]) {
pizza_t đồng bằngPizza;
plainPizza.getCost = &plainPizzaCost;
pizza_t dàyLớp vỏPizza;
dàyCrustPizza.getCost = &thickCrustPizzaCost;
toppingDecorator_t mozzarella;
mozzarella.tempPizza = plainPizza;
mozzarella.getCost = &mozzarellaCost;
toppingDecorator_t cà chua;
cà chua.tempPizza = mozzarella.tempPizza;
cà chua.getCost = &tomatoCost;
// bây giờ in chi phí
printf ("Một chiếc pizza trơn có giá %f\n", plainPizza.getCost ());
printf ("Một chiếc bánh pizza mozzarella có giá %f\n", mozzarella.getCost (&mozzarella));
printf ("Một chiếc pizza cà chua và mozzarella có giá %f\n", Tomato.getCost (&mozzarella));
}
Không chắc tại sao bài đăng này bị đánh giá thấp, nhưng dù sao... một người bạn đã giải quyết vấn đề này cho tôi và tôi nghĩ tôi sẽ đăng câu trả lời ở đây - cảm ơn Marcel :o)
#include
#include
typedef struct _pizza pizza_t;
typedef double (* getCost)(struct _pizza * self);
cấu trúc typedef _pizza {
getCost getCostFunc;
} pizza_t;
cấu trúc typedef _plainPizza {
cơ sở pizza_t;
} plainPizza_t;
typedef struct _toppingDecorator {
cơ sở pizza_t;
pizza_t * trang trí;
} toppingDecorator_t;
// đây là những chiếc pizza
double plainPizzaCost (plainPizza_t self) {
trả lại 5;
}
// đây là những lớp trên bề mặt
gấp đôi mozzarellaCost (toppingDecorator_t * self) {
return self->trang trí->getCostFunc(self->trang trí) + 3;
}
cà chua gấp đôiCost (toppingDecorator_t * self) {
return self->trang trí->getCostFunc(self->trang trí) + 2;
}
xúc xích đôiCost (toppingDecorator_t * self) {
return self->trang trí->getCostFunc(self->trang trí) + 1;
}
int main(int argc, const char * argv[]) {
plainPizza_t plainPizza;
plainPizza.base.getCostFunc = (getCost) plainPizzaCost;
toppingDecorator_t mozzarella;
mozzarella.base.getCostFunc = (getCost) mozzarellaCost;
mozzarella.trang trí = (pizza_t *) &plainPizza;
toppingDecorator_t cà chua;
cà chua.base.getCostFunc = (getCost) cà chuaCost;
cà chua.trang trí = (pizza_t *) & mozzarella;
toppingDecorator_t xúc xích Ý;
salami.base.getCostFunc = (getCost) salamiCost;
xúc xích.trang trí = (pizza_t *) &tomato;
printf ("Một chiếc pizza cà chua có giá %f\n", Tomato.base.getCostFunc((pizza_t *) &tomato));
printf ("Một chiếc pizza xúc xích Ý có giá %f\n", salami.base.getCostFunc((pizza_t *) &salami));
}
Tôi là một lập trình viên xuất sắc, rất giỏi!