外观模式与单件模式的举例

来源:互联网 发布:淘宝李涛是真是假 编辑:程序博客网 时间:2024/05/01 10:32

#include <iostream>

#include <string>

using namespace std;

//外观模式与单件模式的举例

//外观模式主要用于在一个子系统提供统一的接口,减少类与类之间的耦合

//在外观模式中,对于类而言,成员函数,我们称之为方法 ,对于子系统而言,我们称之为对外的接口

//单件模式中,只允许有一个类的实例

//此处,子系统是Facade(外观类)与Message(消息类),由外观类Facade提供统一的接口

 

//Message类,为了演示简单,只定义了一个属性,和改变属性的接口。

//Message类为一个抽象类,具体的实现由其派生类实现

 

class Message

{

public:

Message():stext(""){}

Message(string settext):stext(settext){}

~Message(){}

 

virtual string GetString()=0;

virtual void SetString(const string &settext)=0;

protected:

string stext;//消息类内容

};

//Facade承担了外观类,作为系统的统一接口,并且用于管理子系统

class Facade

{

public:

~Facade()

{

//单件类中的实例一般为动态构造,因此,需要回收内存

if (Facade::facade!=NULL)

{

delete [] Facade::facade;

}

}

string GetString()//子系统对外的接口之一

{

//实际通过C++的动态多态性原理,调用实际的GetString()方法

return message->GetString();

}

void SetString(const string &settext)//子系统对外的接口之一

{

//同上

message->SetString(settext);

}

void PrintMessage()

{

//仅仅为了演示,可直接在子系统的外部,通过GetString()接口访问

cout<<GetString()<<endl;

}

 

static Facade *GetFacade(Message *messagein);//单件类所需要的静态成员方法

private:

static Message* message;//单件类的实例对像为了指针,并且为静态类型

static Facade* facade;

protected:

Facade(){}

};

Facade* Facade::facade=NULL;//C++中对静态成员的初始化方法

Message* Facade::message=NULL;

 

 

Facade* Facade::GetFacade(Message *messagein)

{

//获取单件类的常规方法

if ( !Facade::facade )

{

facade=new Facade();

Facade::message=messagein;

}

return facade;

}

 

//Messaeg的派生类,用于演示程序

class MyMessage:public Message

{

public:

MyMessage(string settext):Message(settext){}

string GetString(){return stext;}//实现具体的方法

void SetString(const string &settext){stext=settext;}

};

 

int main(int argc,char **argv)

{

MyMessage message("I am liuyan");

Facade::GetFacade(&message)->PrintMessage();

return 0;

}