2016-11-16 2 views
1

多くの場合、ハードウェアが実際に接続されていない状態で、ソフトウェアが実行/シミュレートできる目的で、ハードウェアに関連する特定のプロジェクトでデモモードが必要です。デモモードの機能は、ハードウェアをいくらかシミュレートしますが、明らかにそれを操作しません。プロキシはデモモードを作成するのに適していますか?

私の質問は、プロキシデザインのパターン(またはその点については他のもの)は、ソフトウェアでデモモードを作成するのに適していますか?

簡略化して簡略化した以下の例を考えてみましょう。

class Arm 
{ 
public: 
    int _x = 0; 
    int _y = 0; 

    virtual void move(int x, int y) = 0; 
}; 

class RobotArm : public Arm 
{ 
    virtual void move(int x, int y) 
    { 
     /* assum we have actual hardware coommands here which updates variables */ 
     //_x = x; 
     //_y = y; 

     std::cout << "hardware is not connected, can't move" << std::endl; 
    } 
}; 

class RobotArmDemo : public Arm 
{ 
    virtual void move(int x, int y) 
    { 
     /* no hardware commands here, just update variables */ 
     _x = x; 
     _y = y; 

     std::cout << "Demo Arm moved to " << _x << "," << _y << std::endl; 
    } 
}; 

class Robot 
{ 
public: 
    Arm *leftArm; 
    Arm *rightArm; 
}; 

int main() 
{ 
    Arm * leftArm = new RobotArmDemo; // creating an arm in demo mode! 
    Arm * rightArm = new RobotArm; // this arm is the real one 

    Robot * robot = new Robot; 

    robot->leftArm = leftArm; 
    robot->rightArm = rightArm; 

    // perform action 
    robot->leftArm->move(3, 3); // this is on demo mode 
    robot->rightArm->move(1, 2); // this is real mode 

    return 0; 
} 

上記のコードでは、それぞれの動作方法を示すために、デモアームとリアルアームを1つ作成しました。明らかに実際のデモモードでは、すべての派生オブジェクトにデモ実装が行われます。これはソフトウェアでデモモードを実装する良い方法ですか?

これは実際の大/中型アプリケーションに適用できますか?実際のアプリケーションとデモアプリケーションの両方で、まったく同じ関数が呼び出されるので、このアプローチが気に入っています。あるいは、別個の「デモ」パスは、ほとんど離れたアプリケーション/モジュールになり、実際のアプリケーションではすぐに使い分けられなくなります。

+0

あなたのアプローチは問題ありませんが、これはプロキシパターンではありません。プロキシはありません。 –

+0

多分もっと良い言葉は依存性注入でしょうか、ここを見てください:http://stackoverflow.com/questions/5585436/using-interface-in-c-for-dependency-injection – marcinj

+0

@AlexeyGuseynovはい私はそれが正確にプロキシではないと思ったが、やや似たようなクラスデザイン。 – zar

答えて

0

はい、これは良いアプローチのようです。

あなたのデザインを超えて考えることができるものは、ロボットを作成する抽象的なファクトリクラスであり、正しいオブジェクト(デモまたはリアルクラス)を作成します。したがって、メイン関数の最初の5行は、ファクトリクラスになります。

関連する問題