设计模式实例(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 模式定义 ...
随机推荐
- 最短路径----SPFA算法
求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...
- hpuoj--校赛--面试难题(区间相交问题)
问题 F: 感恩节KK专场--面试难题 时间限制: 1 Sec 内存限制: 128 MB 提交: 294 解决: 39 [提交][状态][讨论版] 题目描述 有n个人要来面试学生会XX部门,要求面 ...
- 基于分布式的短文本命题实体识别之----人名识别(python实现)
目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...
- Internet Explorer Developer Channel 自动化测试 IE 浏览器
IE 原生 Web Driver 调用,通过简单配置,即可自动化测试 IE 浏览器(目前仅限 Internet Explorer Developer Channel 版本).做一些自动化的操作,都是很 ...
- echarts 总结:
options配置项: title: 图表标题的配置 tooltip: 鼠标悬浮的提示 toolbox: 工具栏 series: 数据项,是每一个个的数据对象,可以根据type配置每一项数据的图例. ...
- webpack(构建一个前端项目)详解--升级
升级一个正式的项目结构 分离webpack.config.js文件: 新建一个webpack.config.base.js任何环境依赖的wbpack //public webpack const pa ...
- 消除textarea的空格de长度值
在项目中因为用到文本域textarea输入textarea的长度总是显示 25 那是还怀疑textarea自带有value长度? placeholder属性的长度? 那时候想到类似:ul无序列表li元 ...
- 华为nova 4取代刘海屏
尽管首发被三星“截胡”,但华为依然是第一批发布“打孔屏”新机的厂商.官方已经确认,将于12月17日在长沙发布华为nova 4,主打自拍极点全面屏. 继真机谍照.配置曝光之后,今日华为官方发布一则华为n ...
- 【习题 8-20 UVA-1620】Lazy Susan
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现,如果把连续4个数字进行一次翻转的话. 假设这连续的4个数字的逆序数为x; 那么翻转过后,逆序数就会变成6-x; (最多6个逆 ...
- windows server 打开 FTP 服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹。
解决方案1: 打开高级安全windows防火墙,设置出入站规则. 然后,再打开windows防火墙界面,点击左上角“允许程序或功能通过windows防火墙”,勾选上设置的出入站名称和FTP服务器. 如 ...