設計模式adapter的C++實現源碼

1、目標類Target定義

#ifndef TARGET_H
#define TARGET_H

class Target
{
public:
 Target();
 Target(char* name);
 ~Target();
 virtual char* getName();

private:
 char* sname;
 char* sRes;
};

#endif

 

2、目標類Target實現

#include <string.h>
#include "Target.h"

#define STR_TARGET " Target: "

Target::Target(char* name)
{
 sRes = NULL;
 if(name != NULL)
 {
  sname = new char[strlen(name) + 1];
  strcpy(sname, name);
 }
 else
 {
  sname = NULL;
 }
}

Target::~Target()
{
 if(sname != NULL)
 {
  delete[] sname;
  sname = NULL;
 }

 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }
}

char* Target::getName()
{
 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }

 int len = strlen(sname) + strlen(STR_TARGET);
 sRes = new char[len + 1];
 strcpy(sRes,STR_TARGET);
 strcat(sRes,sname);
 return sRes;
}

 

3、需適配類Adaptee定義

#ifndef ADAPTEE_H
#define ADAPTEE_H

class Adaptee
{
public:
 Adaptee();
 Adaptee(char*);
 ~Adaptee();
  char* getName();
private:
 char* sname;
 char* sRes;
};
#endif

 

4、需適配類Adaptee實現

#include <string.h>
#include "Adaptee.h"

#define STR_ADAPTEE " Adaptee: "

Adaptee::Adaptee(char* name)
{
 if(name != NULL)
 {
  sname = new char[strlen(name) + 1];
  strcpy(sname,name);
 }
 else
 {
  sname = NULL;
 }
 sRes = NULL;
}

Adaptee::~Adaptee()
{
 if(sname != NULL)
 {
  delete[] sname;
  sname = NULL;
 }

 if(sRes != NULL)
 {
  delete[] sRes;
  sRes  = NULL;
 }
}

char* Adaptee::getName()
{
 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }
 int len = strlen(STR_ADAPTEE) + strlen(sname);
 sRes = new char[len +1];
 strcpy(sRes,STR_ADAPTEE);
 strcat(sRes,sname);
 return sRes;
}

 

5、適配類Adapter定義

#ifndef ADAPTER_H
#define ADAPTER_H
#include "Target.h"
#include "Adaptee.h"

class Adapter : public Target, public Adaptee
{
public:
 Adapter();
 Adapter(char*);
 ~Adapter();
 char* getName();
private:
 char* sname;
 char* sRes;
};
#endif

 

6、適配類Adapter實現

#include <string.h>
#include "Adapter.h"

#define STR_ADAPTER " Adapter: "

Adapter::Adapter(char* name) : Adaptee(name),Target(name)
{
 if(name != NULL)
 {
  sname = new char[strlen(name) + 1];
  strcpy(sname,name);
 } else {
  sname = NULL;
 }
 sRes = NULL;
}

Adapter::~Adapter()
{
 if(sname != NULL)
 {
  delete[] sname;
  sname = NULL;
 }

 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }
}

char* Adapter::getName()
{
 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }
 char* st = Target::getName();
 char* sa = Adaptee::getName();
 int len = strlen(sname) + strlen(STR_ADAPTER) + strlen(sa) + strlen(st);
 sRes = new char[len + 1];
 strcpy(sRes,st);
 strcat(sRes,sa);
 strcat(sRes,STR_ADAPTER);
 strcat(sRes,sname);
 return sRes;
}

 

7、適配類Adapter0定義

#ifndef ADAPTER0_H
#define ADAPTER0_H

#include "Target.h"
#include "Adaptee.h"

class Adapter0 : public Target
{
public:
 Adapter0(char*);
 ~Adapter0();
 char* getName();
private:
 Adaptee* adp;
 char* sname;
 char* sRes;

};
#endif

 

8、適配類Adapter0實現

//#include <stdio.h>
#include <string.h>
#include "Adapter0.h"

#define STR_ADAPTER0 " Adapter0: "

Adapter0::Adapter0(char* name) : Target(name)
{
 if(name != NULL)
 {
  sname = new char[strlen(name) + 1];
  strcpy(sname,name);
 }
 else
 {
  sname = NULL;
 }
 sRes = NULL;
 adp = new Adaptee(name);
}

Adapter0::~Adapter0()
{
 if(sname != NULL)
 {
  delete[] sname;
  sname = NULL;
 }

 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }
}

char* Adapter0::getName()
{
 if(sRes != NULL)
 {
  delete[] sRes;
  sRes = NULL;
 }
 char* st = Target::getName();
 char* sa = adp->getName();
 int len = strlen(STR_ADAPTER0) + strlen(sname) + strlen(st) + strlen(sa);
 sRes = new char[len + 1];
 strcpy(sRes,st);
 strcat(sRes,sa);
 strcat(sRes,STR_ADAPTER0);
 strcat(sRes,sname);
 return sRes;
}

 

9、客戶使用類Client實現

#include <stdio.h>
#include "Adapter.h"
#include "Target.h"
#include "Adapter0.h"

int main()
{
 Target* t = new Adapter("test");
 printf("%s/n",t->getName());
 Target* t1 = new Adapter0("test0");
 printf("%s/n",t1->getName());
 return 0;
}

 

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