特性:
适配器通过转换调用已经有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配的手段,而复用已有的功能才是目的。
在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。
优点:
适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成。
增加了类的透明性
提高了类的复用度
灵活性非常好
如果不需要适配器了,删除适配器就可以了,其他的代码都不用修改。基本上就类似一个灵活的构件,想用就用,不想就卸载。
缺点:
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;
}