2008-10-05 56 views
15

是否可以實現Visitor Pattern尊重Open/Closed Principle,但仍然能夠添加新的可訪問類?訪客模式+打開/關閉原理

開放/封閉原則規定:「軟件實體(類,模塊,函數等)應該打開以進行擴展,但關閉以進行修改」。

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); 
    } 
}; 

您可以實現任意數量的派生自AbstractVisitor的類:它是可以擴展的。您無法添加新的可訪問類,因爲從AbstractVisitor派生的類將無法編譯:它因修改而關閉。

AbstractVisitor類樹尊重開放/關閉原則。 AbstractVisitable類樹不尊重Open/Closed原則,因爲它不能被擴展。

除了擴展AbstractVisitor和AbstractVisitable之外,還有其他解決方案嗎?

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); 
    } 
}; 

回答

3

您可能想要查看關於「表達問題」的研究,請參閱

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

我認爲問題主要是學術的,但它已經研究了很多東西,所以有一點點的東西,你可以閱讀來實現它在現有的語言或用各種語言擴展的不同方法。