欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Structural.Bridge桥接模式:分离实体所具有的行为

程序员文章站 2022-05-26 08:39:43
...
思考Bridge模式

  ①Bridge模式的本质分离抽象和实现。它是解决多继承的一套方案,把使用继承改成使用对象组合,解耦了抽象和实现之间固有的绑定关系,从而使“抽象”和“实现”可以沿着各自的纬度独立的变化。

  ②Bridge模式的动机:Bridge模式就是为了处理类的多维度变化,其目的是解耦

  ③由于抽象部分和实现部分是完全分离的。所以可以在运行时动态组合具体的真实实现,从而动态变换功能。此外,同一个真实实现可以被不同抽象对象使用;反过来,同一个抽象也不能有多个不同的实现。

  ④桥接模式是一种很实用的结构型设计模式,如果某个类存在多个独立变化的维度,通过该模式可以将这多个维度分离出来,使它们可以独立扩展。让系统更符合“单一职责原则”。

//结构型模式:桥接模式
//场景:发送提示消息
//消息:普通消息、加急消息和特急消息

//发送方式:站内消息、手机短信、E-mail


Structural.Bridge桥接模式:分离实体所具有的行为

//声明文件

//实现发送消息的统一接口
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;
	}
}