对象模式所属类别简介-单一职责模式
单一职责模式包括: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),各个维度都只做自己的事情。