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

思考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;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值