设计模式实例(Lua)笔记之六(Adapter模式)
1.描写叙述
“我”在 2004 年的时候带了一个项目,做一个人力资源管理,该项目是我们总公司发起的项目,公司一共同拥有 700 多号人,包含子公司,这个项目还是比較简单的,分为三大模块:人员信息管理,薪酬管理,职位管理,当中人员管理这块就用到了适配器模式,是怎么回事呢?当时开发时明白的指明:人员信息简管理的对象是全部员工的全部信息,然后我们就这样设计了一个类图:
这个项目是 04 年年底投产的,执行到 05 年年底还是比較平稳的,中间修修补补也非常正常,05 年年底不知道是那股风吹的,非常多公司開始使用借聘人员的方式招聘人员,我们公司也不例外,从一个人力资源公司借用了一大批的低技术、低工资的人员,分配到各个子公司,总共同拥有将近 200 号人,然后就找我们部门老大谈判,说要添加一个功能借用人员管理,老大一看有钱赚呀,一拍大腿,做!
我带人过去一调研,不是这么简单,人力资源公司有一套自己的人员管理系统,我们公司须要把我们使用到的人员信息传输到我们的系统中,系统之间的传输使用 RMI(Remote Method Invocation,远程对象调用)的方式,可是有一个问题人力资源公司的人员对象和我们系统的对象不同样呀,他们的对象是这种:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmV4dWVmZW5neWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
人员资源公司是把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,而且都放到了 HashMap中,比方人员的姓名放到 BaseInfo 信息中,家庭地址放到 HomeInfo 中,这咱不好说他们系统设计的不好,那问题是咱的系统要和他们系统有交互,怎么办?使用适配器模式,类图例如以下:
2.代码:
require "class" --------IUserInfo-------
IUserInfo = class() function IUserInfo:GetUserName() end function IUserInfo:GetHomeAddress() end function IUserInfo:GetMobileNumber() end function IUserInfo:GetOfficeTelNumber() end function IUserInfo:GetJobPosition() end function IUserInfo:GetHomeTelNumber() end --------UserInfo-------
UserInfo = class(IUserInfo) function UserInfo:GetUserName()
print("姓名叫做...")
end function UserInfo:GetHomeAddress()
print("这里是员工的家庭地址...")
return "0"
end function UserInfo:GetMobileNumber()
print("这个人的手机号码是0000...")
return "0"
end function UserInfo:GetOfficeTelNumber()
print("办公室电话是...")
return "0"
end function UserInfo:GetJobPosition()
print("这个人的职位是BOSS...")
return "0"
end function UserInfo:GetHomeTelNumber()
print("员工的家庭电话是...")
return "0"
end --------OuterUserBaseInfo-------
OuterUserBaseInfo = class() function OuterUserBaseInfo:GetUserName()
print("姓名叫做...")
return "0"
end function OuterUserBaseInfo:GetMobileNumber()
print("这个人的手机号码是0001...")
return "0"
end --------OuterUserOfficeInfo-------
OuterUserOfficeInfo = class() function OuterUserOfficeInfo:GetOfficeTelNumber()
print("办公室电话是...")
return "0"
end function OuterUserOfficeInfo:GetJobPosition()
print("这个人的职位是BOSS...")
return "0"
end --------OuterUserHomeInfo-------
OuterUserHomeInfo = class() function OuterUserHomeInfo:GetHomeAddress()
print("这里是员工的家庭地址...")
return "0"
end function OuterUserHomeInfo:GetHomeTelNumber()
print("员工的家庭电话是...")
return "0"
end --------IOuterUser-------
IOuterUser = class() function IOuterUser:GetUserBaseInfo() end function IOuterUser:GetUserOfficeInfo() end function IOuterUser:GetUserHomeInfo() end --------OuterUser-------
OuterUser = class(IOuterUser) function OuterUser:GetUserBaseInfo()
return OuterUserBaseInfo.new()
end function OuterUser:GetUserOfficeInfo()
return OuterUserOfficeInfo.new()
end function OuterUser:GetUserHomeInfo()
return OuterUserHomeInfo.new()
end --------OuterUserInfo-------
OuterUserInfo = class(IUserInfo) function OuterUserInfo:ctor()
self.m_pOuterUser = OuterUser.new()
end function OuterUserInfo:clear()
self.m_pOuterUser = nil
end -- 获取姓名
function OuterUserInfo:GetUserName()
local pBaseInfo = self.m_pOuterUser:GetUserBaseInfo()
pBaseInfo:GetUserName()
pBaseInfo = nil return "0"
end -- 获取姓名
function OuterUserInfo:GetMobileNumber()
local pBaseInfo = self.m_pOuterUser:GetUserBaseInfo()
pBaseInfo:GetMobileNumber()
pBaseInfo = nil return "0"
end -- 获取家庭地址
function OuterUserInfo:GetHomeAddress()
local pHomeInfo = self.m_pOuterUser:GetUserHomeInfo()
pHomeInfo:GetHomeAddress()
pHomeInfo = nil return "0"
end -- 获取家庭电话
function OuterUserInfo:GetHomeTelNumber()
local pHomeInfo = self.m_pOuterUser:GetUserHomeInfo()
pHomeInfo:GetHomeTelNumber()
pHomeInfo = nil return "0"
end -- 获取办公室号码
function OuterUserInfo:GetOfficeTelNumber()
local pOfficeInfo = self.m_pOuterUser:GetUserOfficeInfo()
pOfficeInfo:GetOfficeTelNumber()
pOfficeInfo = nil return "0"
end -- 获取职位
function OuterUserInfo:GetJobPosition()
local pOfficeInfo = self.m_pOuterUser:GetUserOfficeInfo()
pOfficeInfo:GetJobPosition()
pOfficeInfo = nil return "0"
end --- main ---
function main()
-- 本系统调用
local pYourGirl = UserInfo.new()
pYourGirl:GetMobileNumber() -- 外部系统调用
pYourGirl = OuterUserInfo.new()
pYourGirl:GetMobileNumber()
end main()
执行结果,例如以下:
设计模式实例(Lua)笔记之六(Adapter模式)的更多相关文章
- 《图解设计模式》读书笔记1-2 Adapter模式
目录 Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用. 明确概念: Adaptee:被适配者,即220v电压的电源 Adapter:适配器,即手机充电器 ...
- 设计模式实例(Lua)笔记之四(Builder 模式)
1.描写叙述: 又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我"牛叉公司非常惬意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我我们公司制作了,只是这次又 ...
- 设计模式实例(Lua)笔记之五(Bridge模式)
1.描写叙述 今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都非常赚钱,天天帮我在累加財富,事实上是什么公司我倒是不关心,我关心的是是不是 ...
- 设计模式实例(Lua)笔记之七(Decorator模式)
1.描写叙述 就说说"我"上小学的的糗事吧. 我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是"不是读书的 ...
- 设计模式学习笔记-Adapter模式
Adapter模式,就是适配器模式,使两个原本没有关联的类结合一起使用. 平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类 ...
- Net设计模式实例之适配器模式(Adapter Pattern)
一.适配器模式简介(Brief Introduction) 适配器模式,将一个类装换成客户期望的另外一个接口.Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作. 二.解决的问题( ...
- 设计模式之(二)Adapter模式
今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...
- 设计模式C++描述----06.适配器(Adapter)模式
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...
- 设计模式C++学习笔记之六(Facade门面模式)
Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义 ...
随机推荐
- django uWSGI nginx搭建一个web服务器 确定可用
网上的找了很多篇 不知道为什么不行,于是自己搭建了一个可用的Web 大家可按步骤尝试 总结下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: .确保有一个能够用runserver ...
- [luoguP4302] [SCOI2003] 字符串折叠 解题报告(区间DP)
题目链接:https://www.luogu.org/problemnew/show/P4302 题解: 我们考虑折叠一个区间里的字符串,怎么样才是最优的 1.把这个区间分成几部分分别折叠 2.把这个 ...
- POJ TOYS(叉积的妙用+二分答案)
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16042 Accepted: 7688 Description ...
- TabHost的自定义
使用自定义的TabHost可以不用继承TabActicity,但是要注意的是如果使用Activity作为Content的话,有两处代码是一定要加的.不然就会出现RuntimeError,还有在XML布 ...
- PostgreSQL Replication之第三章 理解即时恢复(4)
3.4 重放事务日志 一旦我们创建了一个我们自己的初始基础备份,我们可以收集数据库创建的XLOG.当时间到时,我们可以使用所有这些XLOG 文件并执行我们所期望的恢复进程.这就像本节描述的一样工作. ...
- WLAN STA/AP 并发
WLAN STA/AP 并发 Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能.对于支持双频并发 (DBS) 的设备,此功能让一些新功能得以实现,例如在用户想要启用热点 ( ...
- 编译php并与nginx整合
告诉 Nginx 如何处理 php 文件: nginx>vim conf/nginx.conf location ~ \.php${ ...
- selenium自动化框架介绍------unittest版本
首先说下unittest的两个问题:1.未实现失败重跑 2.未实现远程的分布式(即多线程呼起多台远程计算机,并行进行用例的执行), 为什么要使用框架: 比较方便,只需要写用例就行,而不用考虑结构.还 ...
- P3514 [POI2011]LIZ-Lollipop(规律+瞎搞)
题意 给一个只有1和2的序列,每次询问有没有一个子串的和为x ( 1≤n,m≤1 000 000 )kkk ( 1≤k≤2 000 000 ) 题解 我觉得是道好题. 主要是证明一个性质:假如有一个字 ...
- Intel投入5亿美元提升14nm工艺CPU需求
虽然14nm行将收尾,但是却有大量的客户在赶“末班车”,导致CPU供货告急. Intel年初宣布增加10亿美元的额外资本支出用于转向更新的.更先进的生产工具,以便增加产能,在本周的第39届纳斯达克投资 ...