2008-10-05 27 views
15

Có thể triển khai Visitor Pattern tôn trọng Open/Closed Principle nhưng vẫn có thể thêm các lớp có thể truy cập mới không?Mẫu khách truy cập + Nguyên tắc mở/đóng

Nguyên tắc mở/đóng nói rằng "thực thể phần mềm (lớp, mô-đun, hàm, v.v.) phải mở để mở rộng nhưng đóng để sửa đổi".

struct ConcreteVisitable1; 
struct ConcreteVisitable2; 

struct AbstractVisitor 
{ 
    virtual void visit(ConcreteVisitable1& concrete1) = 0; 
    virtual void visit(ConcreteVisitable2& concrete2) = 0; 
}; 

struct AbstractVisitable 
{ 
    virtual void accept(AbstractVisitor& visitor) = 0; 
}; 

struct ConcreteVisitable1 : AbstractVisitable 
{ 
    virtual void accept(AbstractVisitor& visitor) 
    { 
     visitor.visit(*this); 
    } 
}; 

struct ConcreteVisitable2 : AbstractVisitable 
{ 
    virtual void accept(AbstractVisitor& visitor) 
    { 
     visitor.visit(*this); 
    } 
}; 

Bạn có thể triển khai bất kỳ số lượng lớp nào xuất phát từ AbstractVisitor: Mở để mở rộng. Bạn không thể thêm một lớp có thể truy cập mới vì các lớp bắt nguồn từ AbstractVisitor sẽ không biên dịch: Nó đóng để sửa đổi.

Cây lớp AbstractVisitor tôn trọng Nguyên tắc mở/đóng. Cây lớp AbstractVisitable không tôn trọng Nguyên tắc Mở/Đóng vì nó không thể được mở rộng.

Có giải pháp nào khác ngoài việc mở rộng AbstractVisitor và AbstractVisitable như dưới đây không?

struct ConcreteVisitable3; 

struct AbstractVisitor2 : AbstractVisitor 
{ 
    virtual void visit(ConcreteVisitable3& concrete3) = 0; 
}; 

struct AbstractVisitable2 : AbstractVisitable 
{ 
    virtual void accept(AbstractVisitor2& visitor) = 0; 
}; 

struct ConcreteVisitable3 : AbstractVisitable2 
{ 
    virtual void accept(AbstractVisitor2& visitor) 
    { 
     visitor.visit(*this); 
    } 
}; 

Trả lời

3

Bạn có thể muốn xem nghiên cứu về "vấn đề biểu hiện", xem ví dụ:

http://lambda-the-ultimate.org/node/2232

Tôi nghĩ rằng vấn đề chủ yếu là học tập, nhưng nó là cái gì đó đã được nghiên cứu rất nhiều, vì vậy có một chút những thứ bạn có thể đọc cách về khác nhau để thực hiện nó bằng các ngôn ngữ hiện hành hoặc có phần mở rộng ngôn ngữ khác nhau .

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