美文网首页设计模式
设计模式之禅-适配器模式

设计模式之禅-适配器模式

作者: 凉快先生 | 来源:发表于2020-12-23 17:03 被阅读0次

Target 是一个类(接口),Adaptee 是一个接口,通过 Adapter 把 Adaptee 包装成 Target 的一个子类(实现类)。

1.业务背景

公司的人力资源系统,用户表结构如1-1,现在公司需要从外面借调一批人进来(外包),需要把这些人的信息从外包公司导入自己的人力资源系统,但外包公司的人力用户表如图1-2。结构完全不一样,这时候就需要在中间失业适配器,将外包的人员信息转换成自己的人员信息。

1-1 1-2

2.代码实现

//用户信息对象

public interface IUserInfo {

//获得用户姓名

public String getUserName();

//获得家庭地址

public String getHomeAddress();

//手机号码,这个太重要,手机泛滥呀

public String getMobileNumber();

//办公电话,一般式座机

public String getOfficeTelNumber();

//这个人的职位是啥

public String getJobPosition();

//获得家庭电话

public String getHomeTelNumber();

}

接口实现:

public class UserInfo implements IUserInfo {

/*

* 获得家庭地址

*/

public String getHomeAddress() {

System.out.println("这里是员工的家庭地址....");

return null;

}

/*

* 获得家庭电话号码

*/

public String getHomeTelNumber() {

System.out.println("员工的家庭电话是....");

return null;

}

/*

* 员工的职位

*/

public String getJobPosition() {

System.out.println("这个人的职位是BOSS....");

return null;

}

/*

* 手机号码

*/

public String getMobileNumber() {

System.out.println("这个人的手机号码是0000....");

return null;

}

/*

* 办公室电话

*/

public String getOfficeTelNumber() {

System.out.println("办公室电话是....");

return null;

}

/*

* 姓名

*/

public String getUserName() {

System.out.println("姓名叫做...");

return null;

}

}

应用如何调用 UserInfo 的信息:

public class App {

public static void main(String[] args) {

//没有与外系统连接的时候,是这样写的

IUserInfo youngGirl = new UserInfo();

//从数据库中查到101个

for(int i=0;i<101;i++){

youngGirl.getMobileNumber();

}

}

}

外系统的人员信息:

public interface IOuterUser {

//基本信息,比如名称,性别,手机号码了等

public Map getUserBaseInfo();

//工作区域信息

public Map getUserOfficeInfo();

//用户的家庭信息

public Map getUserHomeInfo();

}

看外系统的用户信息的具体实现类:

public class OuterUser implements IOuterUser {

/*

* 用户的基本信息

*/

public Map getUserBaseInfo() {

HashMap baseInfoMap = new HashMap();

baseInfoMap.put("userName", "这个员工叫混世魔王....");

baseInfoMap.put("mobileNumber", "这个员工电话是....");

return baseInfoMap;

}

/*

* 员工的家庭信息

*/

public Map getUserHomeInfo() {

HashMap homeInfo = new HashMap();

homeInfo.put("homeTelNumbner", "员工的家庭电话是....");

homeInfo.put("homeAddress", "员工的家庭地址是....");

return homeInfo;

}

/*

* 员工的工作信息,比如职位了等

*/

public Map getUserOfficeInfo() {

HashMap officeInfo = new HashMap();

officeInfo.put("jobPosition","这个人的职位是BOSS...");

officeInfo.put("officeTelNumber", "员工的办公电话是....");

return officeInfo;

}

}

把外系统的用户信息包装成我们公司的人员信息

public class OuterUserInfo extends OuterUser implements IUserInfo {

private Map baseInfo = super.getUserBaseInfo(); //员工的基本信息

private Map homeInfo = super.getUserHomeInfo(); //员工的家庭 信息

private Map officeInfo = super.getUserOfficeInfo(); //工作信息

/*

* 家庭地址

*/

public String getHomeAddress() {

String homeAddress = (String)this.homeInfo.get("homeAddress");

System.out.println(homeAddress);

return homeAddress;

}

/*

* 家庭电话号码

*/

public String getHomeTelNumber() {

String homeTelNumber = (String)this.homeInfo.get("homeTelNumber");

System.out.println(homeTelNumber);

return homeTelNumber;

}

/*

*职位信息

*/

public String getJobPosition() {

String jobPosition = (String)this.officeInfo.get("jobPosition");

System.out.println(jobPosition);

return jobPosition;

}

/*

* 手机号码

*/

public String getMobileNumber() {

String mobileNumber = (String)this.baseInfo.get("mobileNumber");

System.out.println(mobileNumber);

return mobileNumber;

}

/*

* 办公电话

*/

public String getOfficeTelNumber() {

String officeTelNumber = (String)this.officeInfo.get("officeTelNumber");

System.out.println(officeTelNumber);

return officeTelNumber;

}

/*

* 员工的名称

*/

public String getUserName() {

String userName = (String)this.baseInfo.get("userName");

System.out.println(userName);

return userName;

}

}

调用外部的员工

public static void main(String[] args) {

//没有与外系统连接的时候,是这样写的

//IUserInfo youngGirl = new UserInfo();

//老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点

IUserInfo youngGirl = new OuterUserInfo(); 

//从数据库中查到101个

for(int i=0;i<101;i++){

youngGirl.getMobileNumber();

}

}

使用了适配器模式只修改了一句话,其他的业务逻辑都不用修改就解决了系统对接的问题,

而且在我们实际系统中只是增加了一个业务类的继承,就实现了可以查本公司的员工信息,也可以查人力

资源公司的员工信息,尽量少的修改,通过扩展的方式解决了该问题。

适配器模式分为类适配器和对象适配器,上边的例子就是类适配器。

3.对象适配器

相关文章

  • 简说设计模式之适配器模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是适配器模式 适配器模式(Adapter...

  • 结构类模式(读书笔记)

    最近在读秦小波写的设计模式之禅这本书,结构类模式读完了,写下一篇文章做下总结。结构类模式包括适配器模式、桥梁模式、...

  • Javaの设计模式之观察者模式

    推荐阅读:《设计模式之禅》 Observer Pattern 设计模式之观察者模式(发布订阅模式) Demo gi...

  • 设计模式之禅-适配器模式

    Target 是一个类(接口),Adaptee 是一个接口,通过 Adapter 把 Adaptee 包装成 Ta...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 设计模式之禅

    设计模式之禅介绍了23种设计模式,很有价值

  • 设计模式详解——适配器模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之适配器模式,Android设计模式源码解...

  • 设计模式之适配器模式

    设计模式之适配器模式 1. 模式定义 适配器模式又称包装器模式,属于结构型模式,它可以将一个接口转换成客户希望的另...

  • 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 适配器设计模式也并不复杂,适...

  • Swift设计模式-目录

    推荐图书:《Head First设计模式》《大话设计模式》《设计模式之禅》, 设计模式思维导图 图形说明一切: 设...

网友评论

    本文标题:设计模式之禅-适配器模式

    本文链接:https://www.haomeiwen.com/subject/wfqynktx.html