设计模式之实现---适配器模式

/*****************************************

CSlot.h

****************************************/

#include <iostream>
using namespace std;

//两相的插头基类
class CTwoSlotsPlug
{
public:
 virtual void plugIn2Slots() = 0;
};

//一个实插头类:红色的二相插头
class CRed2SlotsPlug : public CTwoSlotsPlug
{
public:
 void plugIn2Slots(){
  cout<<"i'm a 2 slots plug indeed!"<<endl;
 }
};

//三相的插头基类
class CThreeSlotsPlug
{
public:
 virtual void plugIn3Slots() = 0;
};

 

/////////////////////////////////////////
//OK,那么我现在有一个两相的插头,但是插座是三相的
//所以我们需要一个插头转换器(适配器)来做这个工作。
class C2to3Slots : public CThreeSlotsPlug  //要伪装成3相的,所以它“是”(is-a)一个3相的接口。
{
private:
 //有一个2相的插头类的指针(也可以是引用),这是一个用来被伪装的对象。
 CTwoSlotsPlug* m_2plug;
public:
 C2to3Slots(CTwoSlotsPlug* inPlug) : m_2plug(inPlug){}

 //伪装函数
 //把CTwoSlotsPlug::plugIn2Slots()伪装成CThreeSlotsPlug::plugIn3Slots()
 void plugIn3Slots(){
  m_2plug->plugIn2Slots();
 }

};


//这是一个插座类,只允许插入3相的插头
class C3HoldSockets
{
private:
 CThreeSlotsPlug* m_plugOne;
public:
 C3HoldSockets(CThreeSlotsPlug* inPlug) : m_plugOne(inPlug){};

 void chargeBattery(){
  m_plugOne->plugIn3Slots();
 } 
};

/********************************************

testAdapterPatten.cpp

*********************************************/

/*
    设计模式:适配器模式
  将一个类的接口,转换成客户期望的另一个接口。造配器让原本接口不兼容的类可以合作无间。
  过程:  1. 客户通过目标接口调用适配器的方法对适配器发出请求。 2. 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口。 3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
  注意: 这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。
  适配器模式可以有两种实现方式,分别是对象适配器和类适配器,它们分别用组合和继承的方法实现。对于对象适配器,我认为可以由一个has-a和一个is-a组成。其中has-a是指适配器类需要内含一个被适配对象,其中is-a是指类适配器是某个被伪装的对象。对于类适配器就用多重继承来实现也就是两个is-a。指又是被适配对象,又是被伪装对象。

  by 何戬, hejian@cad.zju.edu.cn
*/
#include <iostream>
#include "CSlot.h"
using namespace std;

int main()
{
 //有一个两相的插头
 CTwoSlotsPlug* tsp = new CRed2SlotsPlug();

 //那么我们还需要一个将两相插头插入三相插座的适配器。
 C2to3Slots* adapter = new C2to3Slots(tsp);

 //有一个只适用于三相插头的插座
 C3HoldSockets* hs3 = new C3HoldSockets(adapter);

 hs3->chargeBattery();

 delete hs3;
 delete adapter;
 delete tsp;
 return 0;
}

posted on 2012-11-06 11:19  bitbit  阅读(305)  评论(0编辑  收藏  举报