使用策略设计模式实现输入类

时间:2014-05-03 03:08:34

标签: c++ design-patterns strategy-pattern

我对面向对象编程有点新意。我必须实现一个应该考虑不同输入类型的接口,即。操纵杆,鼠标,xbox等。

运动控制器类将使用该接口,并且播放器类将实现移动类。

我无法将这些想法付诸代码。那么大多数应该进入接口类。

到目前为止我的想象如下:

Class InputInterface
{
  //What goes here? 

}

class Movement : InputInterface
{
}

//Other classes that inherit InputInterface


class PlayerShip
{
  public: 

   MovementController* movementController;
}

所以我知道大多数'控制器'类(操纵杆,360控制器等),使用返回布尔值或浮点值的函数。所以我可能在接口类中有数据成员,它们的值可以由接口类中的成员函数设置。

1 个答案:

答案 0 :(得分:0)

策略模式最好的事情就是保持简单。与客户端对象相关的方法将进入接口,并仅公开客户端调用方法时需要知道的内部对象的信息。您将在客户端对象之外构造具体对象。

template<typename T>
class IInput
{
public:
    virtual ~IInput() { } // if you want to clean up via this interface instead
                          // of the concrete object you will need a virtual destructor
    virtual T Poll() = 0;
};

我已经将类型设为通用类型,但您不必这样做。

您的播放器对象可能如下所示:

#include <memory>

class Player
{
    std::shared_ptr<IInput<float>> velocityx;
    float displacementx;
public:
    Player(std::shared_ptr<IInput<float>> v)
        :velocityx(v)
    {
       displacementx = 0;
    }
    void Update(float elapsedSeconds)
    {
        displacementx += elapsedSeconds * velocityx->Poll();
    }
};

并像这样构造(想象MouseMover是你的具体类)

Player player(std::make_shared<MouseMover>());

或像这样动态:

std::shared_ptr<Player> player = std::make_shared<Player>(std::make_shared<MouseMover>());
相关问题