对于设计模式初学者来说,GoF的这本设计模式(可复用面向对象软件的基础)是有些难理解的,因此我先看了视频教程,附上教程链接网址https://www.bilibili.com/video/av52251106/?p=7。
以下是我的学习笔记整理,分享给有需要的朋友,记录的比较简单,如有不理解的地方可以看原教程视频链接,或者留言给我,本小菜和你一起探讨。
一、动机
1.由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化。
2.如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?
二、代码实例:
class MessagerImp{
public:
virtual void PlaySound() =0;
virtual void DrawShape() =0;
virtual void WriteText() =0;
virtual void Connect() =0;
virtual ~MessagerImp(){}
};
class Messager{
MessagerImp* messagerImp;//new ...
public:
Messager(MessagerImp* mImp):messagerImp(mImp){
}
virtual void Login(string username, string password)=0;
virtual void SendMessage(string message)=0;
virtual void SendPicture(Image image)=0;
virtual ~Messager(){}
};
//平台实现 n
class PCMessagerBase: public MessagerImp{
public:
virtual void PlaySound(){
//************
}
virtual void DrawShape(){
//************
}
virtual void WriteText(){
//************
}
virtual void Connect(){
//************
}
};
class MobileMessagerBase: public MessagerImp{
public:
virtual void PlaySound(){
//=========
}
virtual void DrawShape(){
//=========
}
virtual void WriteText(){
//=========
}
virtual void Connect(){
//=========
}
};
class MessagerLite: public Messager{
public:
//调用父类构造函数
MessagerLite(MessagerImp* mImp):Messager(mImp){
}
virtual void Login(string username,string password){
messagerImp->Connect();
//......
}
virtual void SendMessage(string message){
messagerImp->WriteText();
//......
}
virtual void SendPicture(Image image){
messagerImp->DrawShape();
//......
}
};
class MessagerPerfect: public Messager{
public:
//调用父类构造函数
MessagerPerfect(MessagerImp* mImp):Messager(mImp){
}
virtual void Login(string username,string password){
messagerImp->PlaySound();
//******
messagerImp->Connect();
//......
}
virtual void SendMessage(string message){
messagerImp->PlaySound();
//******
messagerImp->WriteText();
//......
}
virtual void SendPicture(Image image){
messagerImp->PlaySound();
//******
messagerImp->DrawShape();
//......
}
};
void Process(){
//运行时装配
MessagerImp* mImp = new PCMessagerImp();
Messager *m = new Messager(mImp);
}