2010-06-07 30 views
7

Ai đó có thể cho tôi một ví dụ về mẫu thiết kế trang trí trong C++? Tôi đã đi qua phiên bản Java của nó, nhưng thấy khó hiểu phiên bản C++ của nó (từ các ví dụ tôi tìm thấy).Mẫu trang trí trong C++

Cảm ơn.

Trả lời

9

Mẫu thiết kế của Vince Huston, mặc dù bố cục của nó kém, đã thực hiện C++ cho hầu hết các mẫu thiết kế trong cuốn Gang of Four.

Nhấp cho Decorator.

Không có nhiều khác biệt với Java, ngoại trừ bộ nhớ thủ công xử lý mà bạn muốn tốt hơn quấn với con trỏ thông minh :)

+0

+1 cho trang web này.Tôi luôn đề cập đến điều này để triển khai cpp. Tôi cũng nghĩ rằng quản lý bộ nhớ lộn xộn là lý do bạn không thấy mẫu này nhiều trong cpp. –

+0

Tôi không luôn đề cập đến việc triển khai, nhưng tôi đánh giá cao việc không bị spam bởi quảng cáo và các lời khuyên khi nào nên áp dụng, khi nào không và những gì nó mang lại so với các mẫu liên quan khác. –

6

tôi đã tìm thấy các trang web Sourcemaking là một khá tốt một khi nói đến explaining different Design Patterns.

Mẫu thiết kế Decorator có ví dụ C++, chẳng hạn như overview example, "before and after" và example with packet encoding/decoding.

+0

+1 cho câu trả lời tuyệt vời. Tôi đã kiểm tra ví dụ thứ hai được cung cấp ở đó (https://sourcemaking.com/design_patterns/decorator/cpp/2) - không phải là nó thiếu một destructor ảo trong lớp giao diện (lớp Widget)? –

+1

@GuyAvraham - cảm ơn. Bạn là chính xác, các lớp cơ sở (es) nên có destructors ảo như là một "thực hành chính xác" chung. Tuy nhiên, trong ví dụ này, mã của chúng sẽ hoạt động tốt vì a) chúng không xóa bất kỳ đối tượng nào thông qua một con trỏ của lớp cơ sở (chúng không xóa chúng ở tất cả?!?!? Chúng chỉ trả về/thoát, ** loại của sloppy ** ...) và b) các nhà xây dựng của các đối tượng có nguồn gốc 'không phân bổ bất kỳ tài nguyên/mở bất kỳ tập tin/vv, vì vậy về mặt kỹ thuật, không gọi destructors của họ sẽ không gây ra vấn đề ... TODAY. Nhưng bạn đúng - khi mã tăng lên, điều này có thể thay đổi. Nắm bắt tốt! – Dan

2
#include <iostream> 
using namespace std; 

class Computer 
{ 
public: 
    virtual void display() 
    { 
     cout << "I am a computer..." << endl; 
    } 
}; 

class CDDrive : public Computer 
{ 
private: 
    Computer* c; 
public: 
    CDDrive(Computer* _c) 
    { 
     c = _c; 
    } 
    void display() 
    { 
     c->display(); 
     cout << "with a CD Drive..." << endl; 
    } 
}; 

class Printer : public Computer 
{ 
private: 
    CDDrive* d; 
public: 
    Printer(CDDrive* _d) 
    { 
     d = _d; 
    } 
    void display() 
    { 
     d->display(); 
     cout << "with a printer..." << endl; 
    } 
}; 

int main() 
{ 
    Computer* c = new Computer(); 
    CDDrive* d = new CDDrive(c); 
    Printer* p = new Printer(d); 

    p->display(); 
} 
+5

đây là một giải pháp tốt cho một vấn đề khác, nhưng đây không phải là mẫu trang trí "thực sự", thiết kế này thiếu lớp trang trí được thừa kế bởi bất kỳ trang trí nào trong trường hợp máy in và ổ đĩa CD này –

Các vấn đề liên quan