据推测,只有一个键盘 - 因此只有一个“键盘接口对象”,对吧?与显示类似 [好吧,可能有两个显示,但仍然]。
所以我的建议是有一个注册和一个保存注册接口的“容器”,如下所示:
class KeyPad
{
 public:
    int getKeyPressed();
};
class Display
{
  public:
     OutputText(std::string msg);
};
... bunch of other stuff ... 
class HardwareRegistry
{
   priviate:
      Keypad  *keypad;
      Display *display;
      static HardwareRegistry *myself; 
   public:
      Keypad*  GetKeypad() { return keypad; }
      Display* GetDisplay() { return display; }
      void RegisterKeypad(Keypad *akeypad) { keypad = akeypad; }
      void RegisterDisplay(Display *adisplay) { display = adisplay; } 
      static HardwareRegistry* GetHwRegistry() 
      { 
         if (!myself) myself = new HardwareRegistry; 
         ASSERT(myself);  // If we don't have a pointer now, panic!
         return myself; 
      }
 };
然后,您只需要一个单例模式来提供您的 HardwareRegistry,并在您在硬件初始化期间创建设备时注册设备。
当然,如果您支持不同类型的键盘、显示器等,那么您将使用“接口基类”来实现它们,例如,注册表返回 KeypadBase 类型。