设计模式C++学习笔记之八(Adapter适配器模式)
适配器模式,使用之处比较特殊,不属于常规设计模式,主要用于不同系统之间的处理。是将一个类的接口转换成客户希望的另外一个接口。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适配器模式)的更多相关文章
- 《Head first设计模式》学习笔记 – 迭代器模式
<Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...
- C#设计模式学习笔记:(6)适配器模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用. 一.引言 从今天开始我们开始讲结构型设计模式,结构型设 ...
- 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...
- 设计模式学习笔记-Adapter模式
Adapter模式,就是适配器模式,使两个原本没有关联的类结合一起使用. 平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类 ...
- 《Head First 设计模式》学习笔记——适配器模式 + 外观模式
在ADO.NET中.对于我们从数据库中取出的数据都要放到一个DataSet中,无论你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供 ...
- 设计模式(七):Adapter 适配器模式 -- 结构型模式
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化. 例子1:iphone4,你即可以 ...
- 《Android源码设计模式》学习笔记之ImageLoader
微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...
- C++ 常用设计模式(学习笔记)
1.工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式 1).简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类. typedef enum { T80 ...
- 【设计模式】学习笔记15:代理模式(Proxy Pattern)
本文出自 http://blog.csdn.net/shuangde800 本笔记内容: 1. JAVA远程代理调用(RMI) 2. 代理模式 走进代理模式 在上一篇的状态模式中,我们实现了一个糖 ...
随机推荐
- oracle数据泵导入导出命令
1.在PL/SQL的界面,找到Directories文件夹,找到目录文件的路径 2.通过SSH进入服务器 找到相应的路径 cd /u01/oracle/dpdir 输入指令 df -h 查看资源使 ...
- python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)
###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位 线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...
- Nginx记录-Nginx基础(转载)
1.Nginx常用功能 1.Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理. Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能.Nginx可以根据不同的 ...
- [JVM-2]常用JVM命令参数
(1)-Xms20M 表示设置JVM堆内存的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置JVM堆内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM内存 ...
- ruby select 方法,可用于先查询结果后,再次用条件限制
1. 用于条件过滤 @works=DworkPro.all.order(:work_type) @work_pro=@works.select{ |x| x.job_type == 7} 2. sel ...
- PostMan打不开怎么解决
如题: 解决办法: 1.找到以下两个路径直接删除文件,注安装路径不同有可能不同 C:\Users\Administrator\AppData\Roaming\Postman C:\Users\Admi ...
- Redis学习笔记(二)解析dump.rdb文件工具之redis-rdb-tools
https://github.com/sripathikrishnan/redis-rdb-tools 我这里使用docker搭建 docker搭建文档 https://rdbtools.com/do ...
- mybatis字符串转义问题
问题描述 @Select("select * from account order by #{orderBy} #{orderRule} limit #{start},#{offset}&q ...
- Spring MVC整合Mybatis 入门
本文记录使用Intellij创建Maven Web工程搭建Spring MVC + Mybatis 的一个非常简单的示例.关于Mybatis的入门使用可参考这篇文章,本文在该文的基础上,引入了Spri ...
- 【三】Eureka服务注册与发现
1.是什么 Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是一个基于 REST 服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务架构来说是非常 ...