【2013.1.24】我有一个梦想:有一天世界上全部电器都可以用一个充电器来充电——Adapter

// // // // // // // // //

///2013.1.24

// // // // // // // // //

这一个设计模式有以下三种分支:

One-way adapter;

Two-way adapter;

Pluggable adapter。


鉴于本文面向较为基础,

最后一个暂且不表。


如果有兴趣,可以上网寻找更多相关资料。


【核心】将用户的需求与一个已经存在的实体(Adaptee)所适配的一个转换器。


来看一下UML图:

【2013.1.24】我有一个梦想:有一天世界上全部电器都可以用一个充电器来充电——Adapter_第1张图片


一个很简单的例子,

就是插座的接口了。


有些电器为二眼插头接口,

但很不巧,

家里的插座只能插三眼插头,

怎么办呢?(不要说换插座)


这时候就需要一个插头转换器了(自定义名称,转载请注明出处^_^),如下图所示

【2013.1.24】我有一个梦想:有一天世界上全部电器都可以用一个充电器来充电——Adapter_第2张图片


能够将用户的需求(用三眼插座充电)与已有的实体(二眼插头)进行匹配,

从而满足用户需求。


这是一个很简单的设计模式,

但是它的使用面是相当的广。

因为它自身的特点:

在不改变已存在的实体(Adaptee类)的情况下,

对用户需求进行匹配。


因此即使使用者不知道原有类的内部结构,

也可以根据不同的需求对其进行相应转化。


而Two-way Adapter则更进一步,

对双方进行转换。

使各自满足对方的需求。


代码实例:


【大致思路】

继承自用户需求类Target的Adapter方法,需要将已有实体Adaptee类的功能转化为用户所需要的功能。


adapter.h

#ifndef _ADAPTER_H_
#define _ADAPTER_H_

//Client's interface
class Target
{
public:
	Target(){}
	~Target(){}
	virtual void Request() = 0;
};

//Original Object(Can not be modified)
class Adaptee
{
public:
	char* specialRequest();
};

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

	void Request();
};

#endif

adapter.cpp

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

char* Adaptee::specialRequest()
{
	return "Two-Enter Plugs";
}

void Adapter::Request()
{
	//Call specialRequest  from Adaptee
	std::cout<<this->specialRequest()<<" transform to Three-Enter Plugs"<<std::endl;
}

main.cpp

#include"Adapter.h"

int main()
{
	Target* adapter = new Adapter();
	adapter->Request();

	return 0;
}

输出结果:



【注意事项】

在Adapter选择的继承方式中,Target是public继承的,但是Adaptee是private继承的。

这是为什么呢?


因为Target是接口,是用户的需求,这是公开的。

但是Adaptee是已经存在的实体,

用户是不能够直接访问的。(如果不知道private继承方式请自行google)


除此之外,

更多使用适配器的时候,

Adaptee的内部具体代码是不可知的,

只有对外的一些接口名称。

这种情况下, 

我们又怎么能让用户去调用呢?

你可能感兴趣的:(设计模式,C++,C++,适配器模式)