代码设计模式之适配器模式(Adapter)

本文探讨了适配器模式在软件设计中的作用,包括其优点、缺点及适用范围。通过具体实例展示了如何利用适配器模式在不修改原有系统接口的情况下,实现不同系统之间的交互。同时,介绍了类适配与对象适配两种实现方式,并提供了相应的代码示例。

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

特性:

适配器通过转换调用已经有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配的手段,而复用已有的功能才是目的。

在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。

 

优点:

适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成。

增加了类的透明性

提高了类的复用度

灵活性非常好

如果不需要适配器了,删除适配器就可以了,其他的代码都不用修改。基本上就类似一个灵活的构件,想用就用,不想就卸载。

 

缺点:

1、类适配。

       主要使用类继承的原理进行实现,在适配多个类时,需要相应添加适配类的实现。

2、对象适配。

       如果当前适配类不满足了,需要新的对象来实现,这个时候改动具体的对象实现类,相当于将适配类进行了一个整体的修改。

 

适用范围:

要修改一个己经投产中的接口时,适配器模式可能是最适合的模式了。

 

例子:

       原系统要求在终端上实现登录,后来业务大了,要求再开发一套WEB版的系统,这个时候在原CS系统和WEB系统上都有一个LOGIN,在不改动原系统接口的基础上让CS系统适配WEB登录,让WEB登录也适配CS登录接口。

 

类图:

类的适配图:

对象的适配图:

 

 

类适配代码:

login.h

#ifndef LOGIN_H
#define LOGIN_H


class CLogin
{
public:
	CLogin(void);
	~CLogin(void);

	void pc_login();
};

#endif


login.cpp

#include "StdAfx.h"
#include "login.h"
#include <iostream>

CLogin::CLogin(void)
{
}

CLogin::~CLogin(void)
{
}

void CLogin::pc_login()
{
	std::cout<<"pc login success."<<std::endl;
}


weblogin.h

#ifndef WEBLOGIN_H
#define WEBLOGIN_H


class CWebLogin
{
public:
	CWebLogin(void);
	~CWebLogin(void);

	void web_login();
};

#endif


weblogin.cpp

#include "StdAfx.h"
#include "weblogin.h"
#include <iostream>

CWebLogin::CWebLogin(void)
{
}

CWebLogin::~CWebLogin(void)
{
}

void CWebLogin::web_login()
{
	std::cout<<"web login success."<<std::endl;
}


adapterloginforclass.h

#ifndef CAPATERLOGINFORCALSS_H
#define CAPATERLOGINFORCALSS_H

#include "login.h"
#include "weblogin.h"

class CAdapterLoginForClass : public CLogin ,public CWebLogin
{
public:
	CAdapterLoginForClass(void);
	~CAdapterLoginForClass(void);
};

#endif

//在C++中使用多重继承。

adapterloginforclass.cpp

#include "StdAfx.h"
#include "adapterloginforclass.h"

CAdapterLoginForClass::CAdapterLoginForClass(void)
{
}

CAdapterLoginForClass::~CAdapterLoginForClass(void)
{
}

 

调用演示:

	CAdapterLoginForClass *calogin = new CAdapterLoginForClass();
	calogin->pc_login();
	calogin->web_login();


 

对象适配实现:

adapterlogin.h

#ifndef ADAPTERLOGIN_H
#define ADAPTERLOGIN_H

#include "login.h"
#include "weblogin.h"

class CAdapterLogin : public CLogin
{
public:
	CAdapterLogin(void);
	~CAdapterLogin(void);

	void web_login();
private:
	CWebLogin *m_wlogin;
};

#endif


类中有一个适配WEBLOGIN的对象m_wlogin,通过对象来实现适配器中的方法。

adapterlogin.cpp

#include "StdAfx.h"
#include "adapterlogin.h"


CAdapterLogin::CAdapterLogin(void)
{
	m_wlogin = new CWebLogin();
}

CAdapterLogin::~CAdapterLogin(void)
{
	delete m_wlogin;
}


void CAdapterLogin::web_login()
{
	m_wlogin->web_login();
}


演示:

// Adapter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "login.h"
#include "weblogin.h"
#include "adapterlogin.h"
#include "adapterloginforclass.h"


int _tmain(int argc, _TCHAR* argv[])
{
#if 0
	CLogin *pc = new CLogin();
	pc->pc_login();
	delete pc;
	
	CWebLogin *web = new CWebLogin();
	web->web_login();
	delete web;
#else
	CAdapterLogin * adapter = new CAdapterLogin();
	adapter->pc_login();
	adapter->web_login();
#endif

	CAdapterLoginForClass *calogin = new CAdapterLoginForClass();
	calogin->pc_login();
	calogin->web_login();

	system("pause");
	return 0;
}



 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边缘998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值