我不能完全肯定,如果我收到了你的问题的权利。从阅读这个问题看来,你正在寻找观察者的设计模式。然而,你给自己的问题的答案并不符合这种解释......
如果你想要你的UI在每次状态机改变时都会更新,那么你可能需要看一下Wikipedia,CodeProject处的观察者模式,或者只是谷歌。它是最常见的设计模式之一,如果你不知道它,你肯定应该花几分钟的时间来亲身体验它。
作为一个示例,说明如何将此模式应用于您的域,让我们假设您的LayoutManager在用户使用编辑工具添加或移除节点/边缘时重绘图。您不想直接从编辑工具中调用LayoutManager,因为这会强烈地影响这两个组件。因此,你可以按如下方式指定一个观察者接口(我使用C++在这里,因为我不知道你的应用程序是用什么语言都):
class StateMachineModelObserver
{
public:
virtual void nodeChanged(Node* n)=0;
virtual void edgeChanged(Edge* e)=0;
};
让想要被通知更改任何主题状态机模型继承该类并实现其功能。例如: -
class MyStateMachineLayoutManager : public StateMachineModelObserver
{
public:
void foo() {} // these are
void bar() {} other functions of the layout manager
virtual void nodeChanged(Node* n)
{
redraw();
}
virtual void edgeChanged(Edge* e)
{
redraw();
}
};
现在,你需要你的状态机模型所提供的功能,允许您订阅和退订的通知,您需要发送通知。
class MyStateMachineModel
{
public:
Node* addNode()
{
Node* n=new Node();
insertNodeIntoModel();
notify(n);
return n;
}
void subscribe(StateMachineModelObserver* o)
{
m_mutex.lock();
m_observers.insert(o);
m_mutex.unlock();
}
void unsubscribe(StateMachineModelObserver* o)
{
m_mutex.lock();
m_observers.insert(o);
m_mutex.unlock();
}
private:
void notify(Node* n)
{
m_mutex.lock();
for_each(m_observers.begin(), m_observers.end(),
[](StateMachineModelObserver* o)
{
o->nodeChanged(n);
}
);
m_mutex.unlock();
}
std::set<StateMachineModelObserver*> m_observers;
std::mutex m_mutex;
};
现在,所有你需要做的就是给LayoutManager订阅状态机模型,每一次模型的变化(在这里被添加一个节点),将自动通知。您可以为不同的通知设置不同的观察者界面,或者您可以为单个观察者界面提供不同类型的通知的独立功能。