设计模式-- 3.适配器模式

适配器模式

在这里插入图片描述
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

角色和职责

请求者(client):客户端角色,需要使用适配器的对象,不需要关心适配器内部的实现,只对接目标角色。
目标角色(Target):目标角色,和client直接对接,定义了client需要用到的接口。
这是客户所期待的接口。目标可角色以是具体的或抽象的类,也可以是接口。
源角色(Adaptee):源角色, 需要被进行适配的对象。也叫源对象。
适配器角色(Adapter):适配器角色 适配器,负责将源对象转化,给client做适配。
通过在内部包装一个源对象(Adaptee),把源接口转换成目标接口。
这四个角色是保证这个设计模式运行的关键。

代码演示

源角色

//源角色
class MyPrint 
{
   
public:
	void operator()(int v1, int v2){
   //重载operator()
		cout << v1 + v2 << endl;			
	}
};

目标角色

//目标角色
class Target
{
   
public:
	virtual void operator()(int v) = 0;
	virtual ~Target(){
   };
};

适配器角色

//适配器角色
class Adapter : public Target
{
   
public:
	Adapter(int param){
   
		this->param = param;
	};
	void operator()(int v) {
   
		myPrint(v,param);	
	}
private:
	MyPrint myPrint;
	int param;
};

客户角色

//client
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
   
	vector<int> v;
	for(int i=0;i<10;i++)
	{
   
		v.push_back(i);
	}
	//for_each(v.begin(),v.end(),MyPrint());//直接传入源角色对象,不满足条件,编译也不会通过
	for_each(v.begin(),v.end(),Adapter(12));//传入适配器,由适配器内部来操作。
	return 0;
}

使用for_each函数,需引入algorithm头文件,for_each函数需要三个参数,
第一个first 是迭代器,指向容器中第一个元素,
第二个last 是迭代器,指向容器中最后一个元素的下一个位置。
第三个fn 是一个可调用对象(函数指针、函数对象或Lambda表达式),它接受容器中元素的引用作为参数。
for_each函数原型:

template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function fn)
{
   
  for(;first!=last; ++first;) {
   
    fn (*first);
  }
  return fn;      // or, since C++11: return move(fn);
}

对于不同的函数调用,Function参数可以表示具有重载的()运算符的类类型。最终,for_ach()代码将具有一个使用fn()的表达式。
如果最后的for each()参数fn是指向函数的指针,而()调用该函数。
如果最后的for each()参数fn是一个函数对象(确切的说是函数对象),则fn将是调用其重载的operator()运算符的对象。(也是本例中我们使用的)。
for_each 函数 是一个模板函数,内部就是对内置的for循环语句的封装。基于模板可遍历符合要求所有容器元素。
函数对象:重载的operator()运算符的非抽象类,实例化出的对象,可称为函数对象。可以像调用函数一样使用函数对象加([参数])的方式,会自动调用重载的operator(),故而称之为函数对象。
在这里插入图片描述
适配器模式 UML类图中,客户端和目标角色直接对接。但是我们上面的例子中,for_each()中,传入的是一个函数对象。故而直接Client和适配器接触。

相关推荐

  1. 设计模式适配器模式

    2024-01-13 21:38:09       69 阅读
  2. 设计模式——适配器模式

    2024-01-13 21:38:09       56 阅读
  3. 设计模式-适配器模式

    2024-01-13 21:38:09       53 阅读
  4. 设计模式——适配器模式

    2024-01-13 21:38:09       46 阅读
  5. 设计模式-适配器模式

    2024-01-13 21:38:09       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 21:38:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 21:38:09       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 21:38:09       82 阅读
  4. Python语言-面向对象

    2024-01-13 21:38:09       91 阅读

热门阅读

  1. C++ 并发编程 | 并发世界

    2024-01-13 21:38:09       64 阅读
  2. QT基础篇(4)QT5基本对话框

    2024-01-13 21:38:09       48 阅读
  3. C++ (MFC) 单程序运行(防止多开程序)

    2024-01-13 21:38:09       68 阅读
  4. go如何终止多个for select循环嵌套

    2024-01-13 21:38:09       52 阅读
  5. Redis面试题12

    2024-01-13 21:38:09       53 阅读
  6. 达梦数据实时同步工具DMHS常见故障处理

    2024-01-13 21:38:09       52 阅读
  7. Union-Find

    2024-01-13 21:38:09       61 阅读
  8. 【数模百科】2004-2023年美赛获奖论文下载

    2024-01-13 21:38:09       63 阅读