あなたの質問が正しかったかどうかは完全にはわかりません。質問を読むと、オブザーバーのデザイン パターンを探しているようです。しかし、あなた自身の質問に対するあなたの答えは、その解釈と実際には一致しません...
たとえば、ステート マシンが変更されるたびに UI を更新する場合は、WikipediaやCodeProjectでオブザーバー パターンを調べたり、Google で検索したりできます。これは最も一般的な設計パターンの 1 つであり、知らない場合は、数分かけてよく理解してください。
このパターンをドメインに適用する方法の例として、ユーザーが編集ツールでノード/エッジを追加または削除するたびに、LayoutManager でダイアグラムを再描画するとします。編集ツール内から LayoutManager を直接呼び出すことは望ましくありません。これは、これら 2 つのコンポーネントが強く結び付けられるためです。したがって、オブザーバー インターフェイスを次のように指定できます (ここでは 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 をステート マシン モデルにサブスクライブするだけで、モデルが変更されるたびに (ここではノードが追加されます)、自動的に通知されます。さまざまな通知に対してさまざまなオブザーバー インターフェイスを使用することも、さまざまな種類の通知に対して個別の機能を備えた単一のオブザーバー インターフェイスを使用することもできます。