设计模式adapter的C++实现源码

本文详细介绍了适配器模式的设计与实现,通过具体的代码示例展示了如何将不兼容的接口转换为客户端期望的接口,包括目标类、需适配类及适配类的定义与实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值