Published on

设计模式(6)——适配器 Adapter

Authors
  • avatar
    Name
    Leon
    Twitter

六、Adapter(适配器模式,别名 Wrapper 包装器模式,类对象结构型模式)

1. 问题:

  当系统需要使用一个接口,而此接口与系统正在使用的接口不兼容时。

2. 意图:

  将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

3. 适用:

  想使用一个已经存在的类,而它的接口不符合需求。

4. 类图:

5. 中间层思考:

  适配器模式需要使用的类与已有类之间加了一个中间层 —— Adapter,来解决接口不兼容的问题。

6. C++实现:

  Adapter 模式根据实现方式不同,有类模式(继承)的适配器和对象(组合)模式的适配器。

  1. 编写一个类 Adapter,包含一个与系统兼容的函数 Request
  2. 让类 Adapter 继承要适配的类 Adaptee 或 组合一个 Adaptee 对象
  3. 函数 Request 调用 Adaptee 中的 具体函数

Adapter.h

// Adapter.h
#pragma once

class Target {
public:
	Target();
	virtual ~Target();
	virtual void Request();

protected:
private:
};

class Adaptee {
public:
	Adaptee();
	~Adaptee();
	void SpecificRequest();
protected:
private:
};

class Adapter : public Target, private Adaptee {
public:
	Adapter();
	~Adapter();
	void Request();
protected:
private:
};

Adapter.cpp

// Adapter.cpp
#include "Adapter.h"

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

Target::Target(){}
Target::~Target(){}
void Target::Request() {
	std::cout << "Target::Request" << std::endl;
}

Adaptee::Adaptee() {}
Adaptee::~Adaptee() {}
void Adaptee::SpecificRequest() {
	std::cout << "Adaptee::SpecificRequest" << std::endl;
}

Adapter::Adapter() {}
Adapter::~Adapter() {}
void Adapter::Request() {
	this->SpecificRequest();
}

main.cpp

// main.cpp
#include "Adapter.h"
#include <iostream>
using namespace::std;

int main(int argc, char* argv[]) {
	Target* tar = new Adapter();
	tar->Request();
	return 0;
}