短い質問
C++ドメイン モデルが 1 つあります。内部 API で使用されるいくつかのメソッドと、その他のパブリック メソッドがあります。これらの API メソッドを公開したくありません。これらのメソッドを隠すためにプロキシ パターンを使用することを考えています。これは良い考えだと思いますか?これを達成するための設計パターンはありますか?
長い例
ソフトウェアで制御できるが、一部の技術者が手動で動かすこともできるロボット アームが遠隔地にあるとします。それは、それが保持しているオブジェクトの種類を知ることを可能にするいくつかのセンサーを持っています. 私のプロジェクトでは、これはまったく異なるものですが、これは例として使用しているだけです。したがって、 RoboticHeldObject抽象クラスを含む1 つのRoboticArmクラスが必要です。RoboticArmは、腕を動かすだけでなく、どの RoboticHeldObject を保持しているかを知らせます。ただし、オブジェクトをピックアップしてリリースすることはできません。これは、ロボットを操作する技術者によって決定されます。したがって、次のようになります。
---------------------------------------------
RoboticArm
---------------------------------------------
+ heldObject() RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject RoboticHeldObject*
- service RobotService
実装は非常に複雑なので、実際に難しい作業を実行する外部クラスRobotServiceを使用します。ただし、実際にRobotServiceを使用するのはRoboticArmであり(したがって機能を備えています)、残りの世界は RobotService について何も知らないため、Anemic Domain Model ではありません。
ここでの問題は、 releaseObject()とholdObject()は、ここではRobotServiceのみが使用する API メソッドです。これらは、技術者がアームに保持されているオブジェクトを解放するか、新しいオブジェクトを配置するたびに、RobotServiceによってのみ呼び出されます。したがって、ネットワーク イベントがRobotServiceによって処理されるときに呼び出されます(アームは離れた場所にあるため、イベントはネットワーク経由で受信されることに注意してください)。例えば:
RobotService::handleObjectReleaseEvent(event)
{
RoboticArm *arm = correspondingRoboticArm(event);
arm->releaseObject();
}
私のアプローチ
これらのメソッドを非表示にするには、RoboticArm の名前をRealRoboticArmに変更し、 RoboticArmプロキシ クラスを作成します。
---------------------------------------------
RoboticArm (the proxy)
---------------------------------------------
+ heldObject() RoboticHeldObject*
+ moveUp()
+ moveDown()
---------------------------------------------
- realArm RoboticArm*
---------------------------------------------
RealRoboticArm (the real object)
---------------------------------------------
+ heldObject() RoboticHeldObject*
+ moveUp()
+ moveDown()
+ releaseObject()
+ holdObject(RoboticHeldObject*)
---------------------------------------------
- heldObject RoboticHeldObject*
- service RobotService
RoboticArmはプロキシであるため、RoboticArm::heldObject() は realArm->heldObject()、RoboticArm::moveUp() realArm->moveUp() などを呼び出します。
RobotServiceはRealRoboticArmインスタンスへのポインタを持つため、 releaseObject () などの API メソッドを呼び出すことができます。ただし、アプリケーションの他の部分は、 RealRoboticArm へのポインタを持たないため、 RoboticArm のメソッドしか使用できません。したがって、 releaseObject()とholdObject()は、効果的に聴衆から隠されます。
質問
これがプロキシ パターンなのかアダプター パターンなのかは 100% わかりません。これは、そのようなシステムをモデル化する適切な方法だと思いますか? より良いパターンはありますか?