解决类耦合的方案
2011年04月16日
问题提出:
由于在创建一个类时没有使用 接口模式 导致一个类实现的功能不够单一,往往包含一组或多组功能。这个时候就可能会出现类的相互嵌套的问题,如:
///send(chMsg);
}
protected:
A* m_pA
}
这个时候就需要解耦了,在上面的例子中根本问题在于class A对于class B来说功能不够单一(当然从更大范围将,它绝对是满足功能单一的条件)。所以也要从这方面入手了
方案一: 建立接口类
///send(chMsg);
}
protected:
A_Send* m_pA
}
优点: 最简单的解决了耦合的关系,并制定了标准
缺点: 一旦发生些变化所有依赖于标准的类需要全部改变
适用范围: 很稳定的接口
方案二: 函数指针
///send(chMsg);
}
void send(const char* cMsg)
{
///耦合,灵巧方便
缺点: 不能良好的体现出属于同种类型的多个方法间的关系,照成一旦添加一个函数就需要定义一种函数指针的不便
适用范围: 函数数量比较少,函数形参变化比较小,函数间的关系依赖不大
方案三: 使用模板加包装器
/// m_Pack;
B m_B;
}
///
class pack
{
public:
pack(T* pParent)
{
m_pParent = pParent;
}
void send(const char* chMsg)
{
m_pPareant->send(chMsg);
}
protected:
T* m_pParent;
}
///
class B
{
public:
B (Pack* pPack)
{
m_pPack = pPack;
}
void send(const char* chMsg)
{
m_pPack ->send(chMsg);
}
protected:
Pack* m_pPack;
}
优点: 完全解除了耦合;能够将不同种类的方法组织成不同的类;不依赖于原始类
缺点: 依赖于模板技术,在linux上分成头文件和源文件不方便
适用范围: 需要将一个类分成多种情况,并且每种都有多个方法,这时可以选择这种方案
方案四: 包装器
///send(chMsg);
}
protected:
void* m_pParent;
}
///send(chMsg);
}
///send(chMsg);
}
protected:
Pack* m_pPack;
}
优点:能够满足低要求的解耦,适用简单
缺点: 不能做到完全解耦
适用范围: 对类的关系相互依赖性很强的情况下可以使用,因为这个时候 包装器 其实就是针对指定父类的包装,不存在对其它类的适配
综上所述,出现耦合的根本原因是因为类的划分在某个层次不在是单一的功能,所以解决耦合的根据解决办法还是能够良好的划分类,当然在必须要用一个类来体现的情况下应当使用接口标准、并继承接口的办法实现。其次是对具备多个功能的类应当有一个合适的包装器,在方法比较少的情况下可以使用函数指针
2011年04月16日
问题提出:
由于在创建一个类时没有使用 接口模式 导致一个类实现的功能不够单一,往往包含一组或多组功能。这个时候就可能会出现类的相互嵌套的问题,如:
///send(chMsg);
}
protected:
A* m_pA
}
这个时候就需要解耦了,在上面的例子中根本问题在于class A对于class B来说功能不够单一(当然从更大范围将,它绝对是满足功能单一的条件)。所以也要从这方面入手了
方案一: 建立接口类
///send(chMsg);
}
protected:
A_Send* m_pA
}
优点: 最简单的解决了耦合的关系,并制定了标准
缺点: 一旦发生些变化所有依赖于标准的类需要全部改变
适用范围: 很稳定的接口
方案二: 函数指针
///send(chMsg);
}
void send(const char* cMsg)
{
///耦合,灵巧方便
缺点: 不能良好的体现出属于同种类型的多个方法间的关系,照成一旦添加一个函数就需要定义一种函数指针的不便
适用范围: 函数数量比较少,函数形参变化比较小,函数间的关系依赖不大
方案三: 使用模板加包装器
/// m_Pack;
B m_B;
}
///
class pack
{
public:
pack(T* pParent)
{
m_pParent = pParent;
}
void send(const char* chMsg)
{
m_pPareant->send(chMsg);
}
protected:
T* m_pParent;
}
///
class B
{
public:
B (Pack* pPack)
{
m_pPack = pPack;
}
void send(const char* chMsg)
{
m_pPack ->send(chMsg);
}
protected:
Pack* m_pPack;
}
优点: 完全解除了耦合;能够将不同种类的方法组织成不同的类;不依赖于原始类
缺点: 依赖于模板技术,在linux上分成头文件和源文件不方便
适用范围: 需要将一个类分成多种情况,并且每种都有多个方法,这时可以选择这种方案
方案四: 包装器
///send(chMsg);
}
protected:
void* m_pParent;
}
///send(chMsg);
}
///send(chMsg);
}
protected:
Pack* m_pPack;
}
优点:能够满足低要求的解耦,适用简单
缺点: 不能做到完全解耦
适用范围: 对类的关系相互依赖性很强的情况下可以使用,因为这个时候 包装器 其实就是针对指定父类的包装,不存在对其它类的适配
综上所述,出现耦合的根本原因是因为类的划分在某个层次不在是单一的功能,所以解决耦合的根据解决办法还是能够良好的划分类,当然在必须要用一个类来体现的情况下应当使用接口标准、并继承接口的办法实现。其次是对具备多个功能的类应当有一个合适的包装器,在方法比较少的情况下可以使用函数指针