适配器模式,使用之处比较特殊,不属于常规设计模式,主要用于不同系统之间的处理。是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也是一个比较简单的模式,直接上代码了。

看代码:

8.1.解释

main(),主程序

IUserInfo,本系统内接口

CUserInfo,本系统内实现类

IOuterUser,外系统接口

COuterUser,外系统实现类

COuterUserInfo,本系统内适配类

说明:COuterUserInfo实现IUserInfo接口,将外部系统实现类COuterUser转换成本系统内的接口IUserInfo。使用外部数据跟使用本系统内部数据一样。

注意:COuterUserInfo继承了IUserInfo,如果同时继承了COuterUser则是类适配器。如果COuterUserInfo只是使用了COuterUser则是对象适配器。

//IUserInfo.h//系统内部的实体接口

#pragma once
#include <iostream>
using std::string;
class IUserInfo
{
public:
    IUserInfo(void)
    {
    }
    virtual ~IUserInfo(void)
    {
    }
    virtual string GetUserName() = 0;
    virtual string GetHomeAddress() = 0;
    virtual string GetMobileNumber() = 0;
    virtual string GetOfficeTelNumber() = 0;
    virtual string GetJobPosition() = 0;
    virtual string GetHomeTelNumber() = 0;
};

//UserInfo.h//系统内部实体类

#pragma once
#include "iuserinfo.h"
#include <iostream>
using std::string;
class CUserInfo :
    public IUserInfo
{
public:
    CUserInfo(void);
    ~CUserInfo(void);
    string GetUserName();
    string GetHomeAddress();
    string GetMobileNumber();
    string GetOfficeTelNumber();
    string GetJobPosition();
    string GetHomeTelNumber();
};

//UserInfo.cpp

#include "StdAfx.h"
#include "UserInfo.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
CUserInfo::CUserInfo(void)
{
}
CUserInfo::~CUserInfo(void)
{
}
string CUserInfo::GetUserName()
{
    cout << "姓名叫做..." << endl;
    return "0";
}
string CUserInfo::GetHomeAddress()
{
    cout << "这里是员工的家庭地址..." << endl;
    return "0";
}
string CUserInfo::GetMobileNumber()
{
    cout << "这个人的手机号码是0000..." << endl;
    return "0";
}
string CUserInfo::GetOfficeTelNumber()
{
    cout << "办公室电话是..." << endl;
    return "0";
}
string CUserInfo::GetJobPosition()
{
    cout << "这个人的职位是BOSS..." << endl;
    return "0";
}
string CUserInfo::GetHomeTelNumber()
{
    cout << "员工的家庭电话是..." << endl;
    return "0";
}

//IOuterUser.h//外部系统实体接口

#pragma once
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
class IOuterUser
{
public:
    IOuterUser(void)
    {
    }
    ~IOuterUser(void)
    {
    }
    COuterUserBaseInfo * GetUserBaseInfo();
    COuterUserHomeInfo * GetUserHomeInfo();
    COuterUserOfficeInfo * GetUserOfficeInfo();
};

//OuterUser.h//外部系统实体类

#pragma once
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
class IOuterUser
{
public:
    IOuterUser(void)
    {
    }
    ~IOuterUser(void)
    {
    }
    COuterUserBaseInfo * GetUserBaseInfo();
    COuterUserHomeInfo * GetUserHomeInfo();
    COuterUserOfficeInfo * GetUserOfficeInfo();
};

//OuterUser.cpp

#include "StdAfx.h"
#include "OuterUser.h"
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
COuterUser::COuterUser(void)
{
}
COuterUser::~COuterUser(void)
{
}
COuterUserBaseInfo * COuterUser::GetUserBaseInfo()
{
    return new COuterUserBaseInfo();
}
COuterUserHomeInfo * COuterUser::GetUserHomeInfo()
{
    return new COuterUserHomeInfo();
}
COuterUserOfficeInfo * COuterUser::GetUserOfficeInfo()
{
    return new COuterUserOfficeInfo();
}

//OuterUserBaseInfo.h

#pragma once
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class COuterUserBaseInfo
{
public:
    COuterUserBaseInfo(void)
    {
    }
    ~COuterUserBaseInfo(void)
    {
    }
    string GetUserName()
    {
        cout << "姓名叫做..." << endl;
        return "0";
    }
    string GetMobileNumber()
    {
        cout << "这个人的手机号码是0001..." << endl;
        return "0";
    }
};

//OuterUserHomeInfo.h

#pragma once
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class COuterUserHomeInfo
{
public:
    COuterUserHomeInfo(void)
    {
    }
    ~COuterUserHomeInfo(void)
    {
    }
    string GetHomeAddress()
    {
        cout << "这里是员工的家庭地址..." << endl;
        return "0";
    }
    string GetHomeTelNumber()
    {
        cout << "员工的家庭电话是..." << endl;
        return "0";
    }
};

//OuterUserOfficeInfo.h

#pragma once
#include <iostream>
using std::cout;
using std::endl;
using std::string;
class COuterUserOfficeInfo
{
public:
    COuterUserOfficeInfo(void)
    {
    }
    ~COuterUserOfficeInfo(void)
    {
    }
    string GetOfficeTelNumber()
    {
        cout << "办公室电话是..." << endl;
        return "0";
    }
    string GetJobPosition()
    {
        cout << "这个人的职位是BOSS..." << endl;
        return "0";
    }
};

//OuterUserInfo.h//由IUserInfo接口派生的实体类,并引入外部系统实体的实例

#pragma once
#include "iuserinfo.h"
#include "OuterUser.h"
#include <iostream>
using std::string;
class COuterUserInfo :
    public IUserInfo
{
public:
    COuterUserInfo(void);
    ~COuterUserInfo(void);
    string GetUserName();
    string GetHomeAddress();
    string GetMobileNumber();
    string GetOfficeTelNumber();
    string GetJobPosition();
    string GetHomeTelNumber();
private:
    COuterUser *m_pOuterUser;
};
//OuterUserInfo.cpp

#include "StdAfx.h"
#include "OuterUserInfo.h"
#include "OuterUserBaseInfo.h"
#include "OuterUserHomeInfo.h"
#include "OuterUserOfficeInfo.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
COuterUserInfo::COuterUserInfo(void)
{
    m_pOuterUser = new COuterUser();
}
COuterUserInfo::~COuterUserInfo(void)
{
    delete m_pOuterUser;
}
string COuterUserInfo::GetUserName()
{
    COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo();
    pBaseInfo->GetUserName();
    delete pBaseInfo;
    pBaseInfo = NULL;
    return "0";
}
string COuterUserInfo::GetHomeAddress()
{
    COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo();
    pHomeInfo->GetHomeAddress();
    delete pHomeInfo;
    pHomeInfo = NULL;
    return "0";
}
string COuterUserInfo::GetMobileNumber()
{
    COuterUserBaseInfo *pBaseInfo = m_pOuterUser->GetUserBaseInfo();
    pBaseInfo->GetMobileNumber();
    delete pBaseInfo;
    pBaseInfo = NULL;
    return "0";
}
string COuterUserInfo::GetOfficeTelNumber()
{
    COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo();
    pOfficeInfo->GetOfficeTelNumber();
    delete pOfficeInfo;
    pOfficeInfo = NULL;
    return "0";
}
string COuterUserInfo::GetJobPosition()
{
    COuterUserOfficeInfo *pOfficeInfo = m_pOuterUser->GetUserOfficeInfo();
    pOfficeInfo->GetJobPosition();
    delete pOfficeInfo;
    pOfficeInfo = NULL;
    return "0";
}
string COuterUserInfo::GetHomeTelNumber()
{
    COuterUserHomeInfo *pHomeInfo = m_pOuterUser->GetUserHomeInfo();
    pHomeInfo->GetHomeTelNumber();
    delete pHomeInfo;
    pHomeInfo = NULL;
    return "0";
}
//Adapter.cpp//使用方法

#include "stdafx.h"
#include "IOuterUser.h"
#include "IUserInfo.h"
#include "UserInfo.h"
#include "OuterUserInfo.h"
void DoIt()
{
    IUserInfo *pYourGirl = new CUserInfo();
    for(int i = 0; i < 101; i += 20)
    {
        pYourGirl->GetMobileNumber();
    }
    delete pYourGirl;
}
void NowDoIt()
{
    IUserInfo *pYourGirl = new COuterUserInfo();

for(int i = 0; i < 101; i += 20)
    {
        pYourGirl->GetMobileNumber();
    }

delete pYourGirl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    DoIt();

NowDoIt();

_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
    _CrtDumpMemoryLeaks();
    return 0;
}

适配器模式属于结构型模式,当出现数据接口不一致的情况下,才会使用到。例如,之前做过的一个系统,所有的组织结构都是由另一个系统来维护,但我们开发的系统需要用到这些组织结构,并且在我们的系统里组织结构是只读的。因为系统设计的原因,所以两个系统的结构设计并不一样,正好应用到了适配器模式。

设计模式C++学习笔记之八(Adapter适配器模式)的更多相关文章

  1. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  2. C#设计模式学习笔记:(6)适配器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用. 一.引言 从今天开始我们开始讲结构型设计模式,结构型设 ...

  3. 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  4. 设计模式学习笔记-Adapter模式

    Adapter模式,就是适配器模式,使两个原本没有关联的类结合一起使用. 平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类 ...

  5. 《Head First 设计模式》学习笔记——适配器模式 + 外观模式

    在ADO.NET中.对于我们从数据库中取出的数据都要放到一个DataSet中,无论你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供 ...

  6. 设计模式(七):Adapter 适配器模式 -- 结构型模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  7. 《Android源码设计模式》学习笔记之ImageLoader

    微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...

  8. C++ 常用设计模式(学习笔记)

    1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...

  9. 【设计模式】学习笔记15:代理模式(Proxy Pattern)

    本文出自   http://blog.csdn.net/shuangde800 本笔记内容: 1. JAVA远程代理调用(RMI) 2. 代理模式 走进代理模式 在上一篇的状态模式中,我们实现了一个糖 ...

随机推荐

  1. webserver nginx / https / upstream

    s nginx server_name 配置 https://segmentfault.com/q/1010000008426747?_ea=1647456 问题:我的host还没有域名,server ...

  2. getResource()和getResourceAsStream以及路径问题【转】【补】

    一 getResource 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就 ...

  3. System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中

    Entity Framework 与 .net4.5 的 System.ComponentModel.DataAnnotations 都有 System.ComponentModel.DataAnno ...

  4. MySQL数据库基本命令-1

    第一章:数据库概述1.数据(data) 数据库(DB) 数据库管理系统(DBMS) 数据库系统(DBS)2.数据库管理系统提供的功能: (1)数据定义语言:DDL (2)数据操作语言:DML 基本的数 ...

  5. C# Math.Round实现中国式四舍五入

    decimal sum = 11111.334; sum = , MidpointRounding.AwayFromZero);  sum:11111.33decimal sum = 11111.34 ...

  6. Excel复制粘贴假死

    把打印机都删除了试一下. 如果还有问题,就把迅雷监听关掉.

  7. Quartz.NET 配置文件详解

    Ø  前言 在之前的 使用 Topshelf 结合 Quartz.NET 创建 Windows 服务 文章中,使用到了 Quartz 的两个配置文件 quartz.config 和 quartz_jo ...

  8. sql审核工具

    https://github.com/Meituan-Dianping/SQLAdvisor/blob/master/doc/QUICK_START.md

  9. 在window上使用 linux shell 删除文件夹递归地

    目的 在windows环境下, 整理代码,代码中含有 .svn 文件夹, 此文件夹在所有受控目录下都存在, 需要统一删除. 但是对windows的shell不熟悉,想用linux rm来删除, 如何实 ...

  10. Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码

    请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...