设计模式(六)——单一职责模式-Bridge

对象模式所属类别简介-单一职责模式

单一职责模式包括:decorator装饰者模式和Bridge桥接模式,用于解决责任不明确,使用继承得到的结果往往随着需求变化,子类数量过大。

当前模式简介动机-Bridge

Bridge-桥接模式

需求

写一个简单PC平台和移动平台的发送消息的程序,这个程序要有登录、发送信息、发送图片的功能。PC平台和移动平台又分为精简版和完整版,完整版在每个动作之前都有音效动作 。

设计一


#include "stdafx.h"
#include <iostream>
using namespace std;

class IMessage
{
public:
	virtual ~IMessage(){};
	virtual void SendMsg() {};
	virtual void SendPic() {};
	virtual void Login() {};

	virtual void Connect() = 0;
	virtual void WriteText() = 0;
	virtual void WritePic() = 0;
	virtual void PlaySound() = 0;
};

class CPCMessge:public IMessage
{
public:
	virtual void WritePic() { std::cout << "CPCMessge WritePic" << std::endl;}
	virtual void WriteText() { std::cout << "CPCMessge WriteText" << std::endl;}
	virtual void Connect()   { std::cout << "CPCMessge Connect" << std::endl;}
	virtual void PlaySound()   { std::cout << "CPCMessge PlaySound" << std::endl;}
};

class CMobileCMessge:public IMessage
{
public:
	virtual void WritePic() { std::cout << "CMobile WritePic" << std::endl;}
	virtual void WriteText() { std::cout << "CMobile WriteText" << std::endl;}
	virtual void Connect()   { std::cout << "CMobile Connect" << std::endl;}
	virtual void PlaySound()   { std::cout << "CMobile PlaySound" << std::endl;}
};

class CPCMessgeLite : public CPCMessge
{
public:
	virtual void SendMsg() { CPCMessge::WriteText(); }
	virtual void SendPic() { CPCMessge::WritePic(); }
	virtual void Login()   { CPCMessge::Connect(); }
};

class CPCMessgePerfect: public CPCMessge
{
public:
	virtual void SendMsg() { CPCMessge::PlaySound(); CPCMessge::WriteText(); }
	virtual void SendPic() { CPCMessge::PlaySound(); CPCMessge::WritePic(); }
	virtual void Login()   { CPCMessge::PlaySound(); CPCMessge::Connect(); }
};

class CMobileCMessgeLite : public CMobileCMessge
{
public:
	virtual void SendMsg() { CMobileCMessge::WriteText(); }
	virtual void SendPic() { CMobileCMessge::WritePic(); }
	virtual void Login()   { CMobileCMessge::Connect(); }
};

class CMobileCMessgePerfect: public CMobileCMessge
{
public:
	virtual void SendMsg() { CMobileCMessge::PlaySound(); CMobileCMessge::WriteText(); }
	virtual void SendPic() { CMobileCMessge::PlaySound(); CMobileCMessge::WritePic(); }
	virtual void Login()   { CMobileCMessge::PlaySound(); CMobileCMessge::Connect(); }
};

int main() //调用
{
	IMessage *msg = new CMobileCMessgePerfect;
	msg->SendMsg();

	return 0;
}
//打印
CMobile PlaySound
CMobile WriteText

需求更改

设计一更改版本

违反原则

1.违反重构d 编译时依赖-》运行时依赖,大量CMobileCMessge::PlaySound()静态绑定。
2.违反设计模式5接口隔离原则,不用到的虚函数不必继承。
virtual void SendMsg() {};
virtual void SendPic() {};
virtual void Login() {};
这三个在继承上CPCMessge不需要,再下层CPCMessgeLite才需要

3.IMessage-CPCMessge-CPCMessgeLite两次继承,违反了设计模式6.优先使用对象组合而不是类继承

设计二

#include "stdafx.h"
#include <iostream>
using namespace std;

class IMessage //业务
{
public:
	virtual ~IMessage(){};
	virtual void Connect() = 0;
	virtual void WriteText() = 0;
	virtual void WritePic() = 0;
	virtual void PlaySound() = 0;
};

class IMessagerImp //平台
{
public:
	IMessage *m_p;
	virtual void SendMsg() = 0;
	virtual void SendPic() = 0;
	virtual void Login() = 0;
};

class CPCMessge:public IMessage
{
public:
	virtual void WritePic() { std::cout << "CPCMessge WritePic" << std::endl;}
	virtual void WriteText() { std::cout << "CPCMessge WriteText" << std::endl;}
	virtual void Connect()   { std::cout << "CPCMessge Connect" << std::endl;}
	virtual void PlaySound()   { std::cout << "CPCMessge PlaySound" << std::endl;}
};

class CMobileCMessge:public IMessage
{
public:
	virtual void WritePic() { std::cout << "CMobile WritePic" << std::endl;}
	virtual void WriteText() { std::cout << "CMobile WriteText" << std::endl;}
	virtual void Connect()   { std::cout << "CMobile Connect" << std::endl;}
	virtual void PlaySound()   { std::cout << "CMobile PlaySound" << std::endl;}
};

class CPCMessgeLite:public IMessagerImp
{
public:
	CPCMessgeLite(CPCMessge *p) { this->m_p = p;} //无法直接:m_p(p),因为m_p是继承的
	virtual void SendMsg() { m_p->WriteText(); }
	virtual void SendPic() { m_p->WritePic(); }
	virtual void Login()   { m_p->Connect(); }
};

class CPCMessgePerfect:public IMessagerImp
{
public:
	CPCMessgePerfect(CPCMessge *p) { this->m_p = p;}
	virtual void SendMsg() { m_p->PlaySound(); m_p->WriteText(); }
	virtual void SendPic() { m_p->PlaySound(); m_p->WritePic(); }
	virtual void Login()   { m_p->PlaySound(); m_p->Connect(); }
};

class CMobileCMessgeLite:public IMessagerImp
{
public:
	CMobileCMessgeLite(CMobileCMessge *p) { this->m_p = p;}
	virtual void SendMsg() { m_p->WriteText(); }
	virtual void SendPic() { m_p->WritePic(); }
	virtual void Login()   { m_p->Connect(); }
};

class CMobileCMessgePerfect:public IMessagerImp
{
public:
	CMobileCMessgePerfect(CMobileCMessge *p) { this->m_p = p;}
	virtual void SendMsg() { m_p->PlaySound(); m_p->WriteText(); }
	virtual void SendPic() { m_p->PlaySound(); m_p->WritePic(); }
	virtual void Login()   { m_p->PlaySound(); m_p->Connect(); }
};

int main() //调用
{
	IMessage *msg = new CMobileCMessge();
	IMessagerImp *msgImp = new CMobileCMessgePerfect((CMobileCMessge*)msg); //(CMobileCMessge*)m 需要显示转换一下
	msgImp->SendMsg();

	return 0;
}
//打印
CMobile PlaySound
CMobile WriteText

设计二更改版本

设计二比设计一区别

模式定义

将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。

模式结构

在这里插入图片描述

要点总结

1.一个维度是业务,一个维度是平台,平台调用业务。先有平台后有业务,两个方向不互相影响。(比如IMessageimp依赖Imessage,PCMessageLite调用PCMessage),各个维度都只做自己的事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章