趁着这两天工作不是非常紧,将一些基础知识整理一下。
UML工具使用Enterprise Architect, 工程使用VC2008编译通过。
先贴出类的关系:
阐述:
class CProductA继承自class Bridge, 具备其属性pIfc, 该属性是执行CIfOperator接口. C++不存在真正意义上的接口, 只是一个纯虚类;
具备GetImp()操作方法用以获得通过接口传过来的实例;
重写(override)Attribute().
class Bridge聚合了接口CIfOperator.
class COperatorA和class COperatorB实现了接口, 并各自重写了Operator()方法, 使其各自具备自身特点。
特点:
class CProductA和class COperatorA, class COperatorB等之间形成了Bridge. 每次给CProductA增加新的实现方法, 只需要新增加一个继承自接口CIfOperator并实现
Operator()方法的类.
下面部分是源代码.
各个类的声明:
#ifndef _BRIDGE_H__
#define _BRIDGE_H__
/*接口*/
class CIfOperator
{
public:
virtual void Operator()=0;
};
/*抽象, 非抽象类*/
class CAbstract
{
protected:
//拥有实例
CIfOperator* pIfc;
public:
/*非纯虚函数必须要定义,否则即使其子类也不能实例化成功*/
virtual void Attribute()
{
}
CIfOperator* GetImp(CIfOperator* p);
};
class CProductA:public CAbstract
{
public:
virtual void Attribute();
};
/*操作实现1*/
class COperatorA:public CIfOperator
{
/* public:*//*接口,可以不用public属性*/
virtual void Operator();
};
/*操作实现2*/
class COperatorB:public CIfOperator
{
/*public:*/
virtual void Operator();
};
#endif/*_BRIDGE_H__*/
#include "Bridge.h"
#include <stdio.h>
void CProductA::Attribute()
{
pIfc->Operator();
}
CIfOperator* CAbstract::GetImp(CIfOperator* p)
{
pIfc = p;
return p;
}
//具体方法实现
void COperatorA::Operator()
{
printf("COperatorA.Operator\n");
}
void COperatorB::Operator()
{
printf("COperatorB.Operator\n");
}
void main()
{
/*e.g. for Bridge*/
CProductA pA;
pA.GetImp(new COperatorA());
pA.Attribute();
pA.GetImp(new COperatorB());
pA.Attribute();
}
Bridge大大降低了类和类的耦合性。