Structural.Bridge桥接模式:分离实体所具有的行为
程序员文章站
2022-05-26 08:39:43
...
思考Bridge模式
//场景:发送提示消息
//消息:普通消息、加急消息和特急消息
①Bridge模式的本质:分离抽象和实现。它是解决多继承的一套方案,把使用继承改成使用对象组合,解耦了抽象和实现之间固有的绑定关系,从而使“抽象”和“实现”可以沿着各自的纬度独立的变化。
②Bridge模式的动机:Bridge模式就是为了处理类的多维度变化,其目的是解耦。
③由于抽象部分和实现部分是完全分离的。所以可以在运行时动态组合具体的真实实现,从而动态变换功能。此外,同一个真实实现可以被不同抽象对象使用;反过来,同一个抽象也不能有多个不同的实现。
④桥接模式是一种很实用的结构型设计模式,如果某个类存在多个独立变化的维度,通过该模式可以将这多个维度分离出来,使它们可以独立扩展。让系统更符合“单一职责原则”。
//结构型模式:桥接模式//场景:发送提示消息
//消息:普通消息、加急消息和特急消息
//发送方式:站内消息、手机短信、E-mail
//声明文件
//实现发送消息的统一接口
class CMsgImp{
public:
//发送消息
//@param strMessage 要发送的消息内容
//@param strReceive 消息的接受者
virtual void Send(string strMessage, string strReceiver) = 0;
};
//抽象的消息对象
class CAbsMsg{
private:
CMsgImp* pMsgImp;//持有一个实现部分的对象指针
public:
//构造函数,传入实现部分的对象
CAbsMsg(CMsgImp* msgimp);
//发送消息,转调实现部分的方法
virtual void BeSent(string strMessage, string strReceiver);
};
//************************具体的消息发送方式*******************
//站内消息的实现
class CMSM : public CMsgImp{
public:
void Send(string strMessage, string strReceiver);
};
//E-mail方式的发送消息
class CEmail : public CMsgImp{
public:
void Send(string strMessage, string strReceiver);
};
//Mobile方式的发送消息
class CMobile : public CMsgImp{
public:
void Send(string strMessage, string strReceiver);
};
//*********************具体的消息类型************************
//普通消息
class CCommonMsg : public CAbsMsg{
public:
CCommonMsg(CMsgImp* msgimp);
};
//加急消息
class CUrgencyMsg : public CAbsMsg{
public:
CUrgencyMsg(CMsgImp* msgimp);
void BeSent(string strMessage, string strReceiver);
};
//特急消息
class CSpecialUrgencyMsg : public CAbsMsg{
public:
CSpecialUrgencyMsg(CMsgImp* msgimp);
void BeSent(string strMessage, string strReceiver);
void Hurry(int iMsgId);
};
//实现文件
//抽象的消息对象
//构造函数,传入实现部分的对象
CAbsMsg::CAbsMsg(CMsgImp* msgimp) : pMsgImp(msgimp){}
void CAbsMsg::BeSent(string strMessage, string strReceiver){pMsgImp->Send(strMessage, strReceiver);}
//************************具体的消息发送方式*******************
//站内消息的实现
void CMSM::Send(string strMessage, string strReceiver)
{
cout << "\"" << strMessage << "\" was sent to " << strReceiver << " by MSM" << endl;
}
//E-mail方式的发送消息
void CEmail::Send(string strMessage, string strReceiver)
{
cout << "\"" << strMessage << "\" was sent to " << strReceiver << " by Email" << endl;
}
//Mobile方式的发送消息
void CMobile::Send(string strMessage, string strReceiver)
{
cout << "\"" << strMessage << "\" was sent to " << strReceiver << " by Mobile" << endl;
}
//*********************具体的消息类型************************
//普通消息
CCommonMsg::CCommonMsg(CMsgImp* msgimp) : CAbsMsg(msgimp){}
//加急消息
CUrgencyMsg::CUrgencyMsg(CMsgImp* msgimp) : CAbsMsg(msgimp){}
void CUrgencyMsg::BeSent(string strMessage, string strReceiver)
{
strMessage = "Urgency : " + strMessage;
CAbsMsg::BeSent(strMessage, strReceiver);
}
//特急消息
CSpecialUrgencyMsg::CSpecialUrgencyMsg(CMsgImp* msgimp) : CAbsMsg(msgimp){}
void CSpecialUrgencyMsg::BeSent(string strMessage, string strReceiver)
{
strMessage = "SpecialUrgency : " + strMessage;
CAbsMsg::BeSent(strMessage, strReceiver);
Hurry(100); //还需要加一条待催促的信息
}
void CSpecialUrgencyMsg::Hurry(int iMsgId)
{
//执行摧促的业务,发出催足的信息,这里简单示意一下
cout << "Hurry : MessageId = " << iMsgId << endl;
}
//测试客户端
void main()
{
//使用站内短息发送消息(普通、加急、特急等)
//创建具体的实现对象
CMsgImp* pMsgImpByMSM = new CMSM();//选择站内短息的方式来发送
//创建一个普通消息对象
CAbsMsg* pCommonMsg = new CCommonMsg(pMsgImpByMSM);
if(pCommonMsg != NULL){//发送普通消息
pCommonMsg->BeSent("A cup of tee please.", "Mary");
delete pCommonMsg; pCommonMsg = NULL;
}
//创建一个加急消息对象
CAbsMsg* pUrgencyMsg = new CUrgencyMsg(pMsgImpByMSM);
if(pUrgencyMsg != NULL){//发送加急消息
pUrgencyMsg->BeSent("A cup of coffee please." , "Bob");
delete pUrgencyMsg; pUrgencyMsg = NULL;
}
//创建一个特急消息对象
CAbsMsg* pSpecialUrgencyMsg = new CSpecialUrgencyMsg(pMsgImpByMSM);
if(pSpecialUrgencyMsg != NULL){//发送特急消息
pSpecialUrgencyMsg->BeSent("A cup of milk please.", "Tony");
delete pSpecialUrgencyMsg; pSpecialUrgencyMsg = NULL;
}
if(pMsgImpByMSM != NULL){
delete pMsgImpByMSM; pMsgImpByMSM = NULL;
}
}