007.设计模式之Adapter模式

来源:互联网 发布:中国手机网络发展现状 编辑:程序博客网 时间:2024/06/17 01:37

007.设计模式之Adapter模式

 

打印机都是串口的, 所以系统都是以串口的形式与打印机通信, 但现在来了一个USB的打印机,

系统已经在用了, 修改的话, 又要测试, 重新发布, 这样子代价太大了, 所以不能修改.

那则么办?

现在有另个方案:

1. 增加一条USB转串口线. USB口接打印机, 串口接系统. 通过增加一条转换线, 而不是修改系统, 也不是修改打印机USB.

2. 把该打印机改造, 改成保持原来USB口的同时, 增加一个串口.

 

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

Adapter模式有两种实现方法: 看下图

 

 

 

 

一种是类适配器, 通过多重继承, 适配器既有原来类的接口, 也继承了新添加类的功能.

一种是对象适配器, 适配器类继承了原来类的接口, 并包含了一个新加类的对象.

 

在以下各种情况下使用适配器模式:

1、 系统需要使用现有的类,而此类的接口不符合系统的需要。

2、 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

3、 (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

 

 

类适配器实现:

 

 

对象适配器实现:

 

 

 

 

#include "stdafx.h"

#include <iostream>

 

class CTarget

{

public:

     CTarget()

     {}

     virtual ~CTarget()

     {}

     virtual void Request() = 0;

};

 

class CAdaptee

{

public:

     CAdaptee()

     {}

     virtual ~CAdaptee()

     {}

     void SpecificRequest()

     {

         std::cout << "CAdaptee::SpecificRequest" << std::endl;

     }

};

// 类适配器

class CClassAdapter : public CTarget, public CAdaptee

{

public:

     CClassAdapter()

     {}

     virtual ~CClassAdapter()

     {}

     virtual void Request()

     {

         CAdaptee::SpecificRequest();

     }

};

 

// 对象适配器

class CObjectAdapter : public CTarget

{

public:

     CObjectAdapter()

     {

         m_pAdaPtee = new CAdaptee();

     }

     virtual ~CObjectAdapter()

     {

         delete m_pAdaPtee;

     }

     virtual void Request()

     {

         m_pAdaPtee->SpecificRequest();

     }

private:

     CAdaptee* m_pAdaPtee;

};

 

int _tmain(int argc, _TCHAR* argv[])

{

     //

     CClassAdapter* pClassAdapter = new CClassAdapter;

     pClassAdapter->Request();

 

     CObjectAdapter* pObjectAdapter = new CObjectAdapter;

     pObjectAdapter->Request();

 

     return 0;

}

 

 

 

 http://download.csdn.net/source/2850906