我不完全确定你的问题是否正确。通过阅读问题,您似乎正在寻找观察者设计模式。但是,您对自己问题的回答并不真正符合这种解释......
如果您希望在每次更改状态机时更新您的 UI,那么您可能希望查看Wikipedia、CodeProject上的观察者模式,或者只是 google 一下。它是最常见的设计模式之一,如果您不了解它,您绝对应该花几分钟来熟悉它。
作为如何将此模式应用于您的域的示例,假设您希望您的 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 订阅到状态机模型,并且每次模型更改(这里:正在添加一个节点)时,它都会自动收到通知。您可以为不同的通知设置不同的观察者接口,也可以为不同类型的通知设置一个具有不同功能的观察者接口。