2010-01-03 49 views
2

所以我需要设计类似的东西:设计问题 - 观察者,工厂,组成多

我有可能含有大量的纸张(可能的不同种类)的电子表格。

每一薄板上有假设1A-9Z细胞。

在每个小区

我可以有一个以上: 字符串, 号, 式 - 这意味着所述细胞获取的操作,例如+, - ,/ *等...和细胞数, 并在细胞我有操作的结果。

我需要设计的类,所以在未来我可以添加细胞的其它类型(除了串/数字/式),也可以添加不同类型的操作,以式 - 所有以容易的方式。

ü会怎么设计呢?

我虽然对这样的事情:

class SpreadSheet 
{ 
    private: 

    vector<Isheet> sheets; 

    public: 

    write(Isheet sheet,int CellNum,ICell value); 
    GetValue(Isheet sheet,int CellNum,ICell value); 
    AddSheet(ISheet sheet); 

}; 


    class Isheet 
    { 
    vector<ICell> cells; // can i do something like that ? cause ICell is a template  
    }; 

template<class T> 
class ICell 
{ 

    Vector<Iobserver> observers; 

    public: 
    T GetValue() {return m_value;}; 
    SetValue(T val) {m_value=val;}; 
    AddObserver(Iobserver obs); 
    NotifyAll(); 
    GetPos() {return m_pos;}; 


    private: 
    T m_value; 
    int m_pos; 

    }; 


    class CInt : public ICell<int> 
{ 

}; 

class CString : public ICell<std:string> 
{ 

}; 

class CFormula : public ICell<int>, Iobserver 
{ 

}; 


class Iobserver 
{ 
    Update(int pos); 
}; 

,无论如何,我真的不知道我应该创建单元格混凝土类(CINT,CString的,CFormula),我应该使用某种工厂的?在哪里放工厂?在ISheet中? 和我最关心的,我应该在哪里计算的CFormula细胞正确的结果? 我使用观察者模式来保持公式单元格在其他单元格更改的情况下更新。

任何建议将是巨大的

回答

5

作为一名工程师向谁“设计模式”是指很少,我最近有一个项目(进行中)与一些计算机科学家工作的乐趣。我已经实现了所有的他们之前所说的“观察者模式”,“工厂”,“反应堆”,等的事情,但说实话,我发现这是一个彻底的无助的方法来思考设计。

你需要的是你的问题的解决方案。想一想:数据流,考虑执行路径,考虑需要什么导致什么。

不要试图让你的问题成为一本教科书的解决方案,可能性,它不会很好地适应,并且最终会得到比有用的更多的抽象层次,并使得代码在几个月后返回时很难理解。

我的两分钱,希望这是有帮助的。