正如您所看到的,我有一个用于调试事件的接口和两个操作Attach和Detach。除此之外,我必须实现Windows和Linux版本,因此当前的设计根本无法扩展。
想象一下,我必须添加:
这种设计不符合比例......
我知道Bridge模式可以解决这个问题,但在这种情况下如何应用呢?
更新
作为第一个修复,我想到将一个成员Operation(Attach / Detach)添加到DebugEventModule。这样,不同类型的附加/分离操作不再需要子类:
的 1
DebugEventModule之间的桥梁 - > DebugEventModuleImpl在这一点上对我来说似乎没用,你能看到在这里拥有一座桥的任何好处吗?没有桥我会:
的 2
如何使用Bridge移动平台特定的东西(操作系统的东西)呢?像这样的东西:
第3
我认为在最后一个设计中,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;