将Bridge模式应用于现有类设计

时间:2016-01-27 16:20:30

标签: c++ oop design-patterns refactoring bridge

No Bridge

正如您所看到的,我有一个用于调试事件的接口和两个操作Attach和Detach。除此之外,我必须实现Windows和Linux版本,因此当前的设计根本无法扩展。

想象一下,我必须添加:

  • DebugEventThread< - DebugEventThreadAttach< - DebugEventThreadDetach
  • DebugEventProcess< - DebugEventProcessAttach< - DebugEventProcessDetach

这种设计不符合比例......

我知道Bridge模式可以解决这个问题,但在这种情况下如何应用呢?

更新 作为第一个修复,我想到将一个成员Operation(Attach / Detach)添加到DebugEventModule。这样,不同类型的附加/分离操作不再需要子类:

1
Bridge
DebugEventModule之间的桥梁 - > DebugEventModuleImpl在这一点上对我来说似乎没用,你能看到在这里拥有一座桥的任何好处吗?没有桥我会:

2
Inheritance
如何使用Bridge移动平台特定的东西(操作系统的东西)呢?像这样的东西:

第3
Platform abstraction
我认为在最后一个设计中,platform_specific()函数将是模块,线程,特定于流程的,这违反了#34;一个责任主体",我不希望这个类是成为一个巨大的",成为无关功能的组合。

更新2: DebugEvent + DebugEventModule的当前实现:

    class DebugEvent {
    public:
      DebugEvent(uint32_t processId,
                 uint32_t threadId);
      virtual ~DebugEvent();
      virtual void Process() = 0;
    private:
      uint32_t _processId;
      uint32_t _threadId;
    };

    class DebugEventModule : public DebugEvent {
    public:
      DebugEventModule (uint32_t processId,
                        uint32_t threadId,
                        handle_t fileHandle,
                        hmodule_t baseOfDll,
                        address_t imageName,
                        uint16_t isUnicode);
      virtual ~DebugEventModule();
      virtual void Process();
    private:
      handle_t _fileHandle;
      hmodule_t _baseOfDll;
      address_t _imageName;
      uint16_t _isUnicode;
    };

    class DebugEventModuleAttach : public DebugEventModule {};
    class DebugEventModuleDetach : public DebugEventModule {};

    class DebugEventModuleAttachWindows : public DebugEventModuleAttach {};
    class DebugEventModuleAttachLinux : public DebugEventModuleAttach {};

    class DebugEventModuleDetachWindows : public DebugEventModuleDetach {};
    class DebugEventModuleDetachLinux : public DebugEventModuleDetach {};


我们的想法是创建一个独立于平台的Windows DEBUG_EVENT: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679308%28v=vs.85%29.aspx

Windows DEBUG_EVENT如下所示:

    typedef struct _DEBUG_EVENT {
      DWORD dwDebugEventCode;
      DWORD dwProcessId;
      DWORD dwThreadId;
      union {
        EXCEPTION_DEBUG_INFO      Exception;
        CREATE_THREAD_DEBUG_INFO  CreateThread;
        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
        EXIT_THREAD_DEBUG_INFO    ExitThread;
        EXIT_PROCESS_DEBUG_INFO   ExitProcess;
        LOAD_DLL_DEBUG_INFO       LoadDll; // - This was DebugEventModuleAttach in the original design
        UNLOAD_DLL_DEBUG_INFO     UnloadDll; // - This was DebugEventModuleDetach in the original design
        OUTPUT_DEBUG_STRING_INFO  DebugString;
        RIP_INFO                  RipInfo;
      } u;
    } DEBUG_EVENT, *LPDEBUG_EVENT;

0 个答案:

没有答案