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. 《图解设计模式》读书笔记1-2 Adapter模式

    目录 Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用. 明确概念: Adaptee:被适配者,即220v电压的电源 Adapter:适配器,即手机充电器 ...

  2. 设计模式实例(Lua)笔记之四(Builder 模式)

    1.描写叙述:      又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我"牛叉公司非常惬意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我我们公司制作了,只是这次又 ...

  3. 设计模式实例(Lua)笔记之五(Bridge模式)

    1.描写叙述 今天我要说说我自己,梦想中的我自己,我身价过亿,有两个大公司,一个是房地产公司,一个是服装制造业,这两个公司都非常赚钱,天天帮我在累加財富,事实上是什么公司我倒是不关心,我关心的是是不是 ...

  4. 设计模式实例(Lua)笔记之七(Decorator模式)

    1.描写叙述 就说说"我"上小学的的糗事吧. 我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是"不是读书的 ...

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

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

  6. Net设计模式实例之适配器模式(Adapter Pattern)

    一.适配器模式简介(Brief Introduction) 适配器模式,将一个类装换成客户期望的另外一个接口.Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作. 二.解决的问题( ...

  7. 设计模式之(二)Adapter模式

    今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...

  8. 设计模式C++描述----06.适配器(Adapter)模式

    一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...

  9. 设计模式C++学习笔记之六(Facade门面模式)

      Facade门面模式,也是比较常用的一种模式,基本上所有软件系统中都会用到. GOF 在<设计模式>一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义 ...

随机推荐

  1. Excel操作之VLOOKUP

    https://support.office.com/en-us/article/VLOOKUP-function-0bbc8083-26fe-4963-8ab8-93a18ad188a1 Use V ...

  2. spark 数据预处理 特征标准化 归一化模块

    #We will also standardise our data as we have done so far when performing distance-based clustering. ...

  3. centos7 安装swftools Apache_OpenOffice

    centos7 yum -y install wget wget http://www.swftools.org/swftools-0.9.2.tar.gz tar -xf swftools-.tar ...

  4. python 3.x 写 shell sed 替换功能

    shell sed 替换功能 f1 = open('yesterday','r',encoding='utf-8') f2 = open('yesterday2','w',encoding='utf- ...

  5. NestedScrollView嵌套ListView可行性总结

    由于公司项目遗留代码仍然使用PullToRefreshListView(后文简称PTRLV),且存在复用,更换RecyclerView成本太大,同时又想使用CoordinatorLayout来实现一些 ...

  6. <Sicily>Threecolor problem

    一.题目描述 有红黄蓝3种颜色的n个珠子,师傅希望悟空把它们排成红色珠子在左,黄色珠子居中,蓝色珠子在右的一行,然后告诉师傅,从左数起,第m个珠子是什么颜色.众所周知,悟空是只猴子,他没有这个耐心,你 ...

  7. Bootstrap modal.js 源码分析

    /* ======================================================================== * Bootstrap: modal.js v3 ...

  8. k近邻法(k-nearest neighbor, k-NN)

    一种基本分类与回归方法 工作原理是:1.训练样本集+对应标签 2.输入没有标签的新数据,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签. 3.一般 ...

  9. 【Git 五】TortoiseGit中SSH密钥的配置方法

    注意:我用的 TortoiseGit 版本是 2.6 的. 一.找到安装目录下的 bin 目录 二.点击 puttygen.exe 三.点击 Generate 生成完毕之后,将 public key ...

  10. 通俗易懂的Git使用入门教程

    原文链接:点我 首先新司机接触 Git 和 Github 可能会搞不清楚两者之间的关系,这里稍微解释一下: 1.Git是一款免费.开源的分布式版本控制系统 2.Github是用Git做版本控制的代码托 ...