设计模式之适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

案例:公司业务需要将会请外包公司的员工一起开发新的项目,需要将外包人员的信息和本公司的人员的基础信息和家庭信息打印出来方便管理人员管理,然本公司的人员信息都存在一起的,外包公司的人员信息分开存储的,这时候需要外包公司人员的信息转化成我们公司的存储形式,不然没办法将信息打印出来。

本公司的人员存储信息

package com.zcm.adapter.entry;

import lombok.*;

import java.util.*;
/**
 * @program: demo
 * @ClassName:UserInfo
 * @Description:
 * @Author:zcm
 * @Date:2021/2/20 15:03
 */
class UserInfo implements IUserInfo {
    @Override
    public List<User> getUserInfo() {
        List<User> list=new ArrayList<>();
        User user=new User();
        user.setUserName("张三");
        user.setMobile("15806043979");
        user.setSex("女");
        user.setEmail("15806043979@163.com");
        user.setAddress("福州鼓楼融汇江山");
        user.setHomeTel("4001-39201923");
        list.add(user);
        return list;
    }
}

/**
 * @program: demo
 * @ClassName:IUserInfo
 * @Description:
 * @Author:zcm
 * @Date:2021/2/20 14:51
 */
 interface IUserInfo {
    /**
     * @Description:获取用户信息
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/20 14:55
     */
    List<User> getUserInfo();
}
@Data
 class User {
    private String userName;
    private String mobile;
    private String address;
    private String sex;
    private String email;
    private String homeTel;
}

外包公司人员存储信息

package com.zcm.adapter.entry;

import com.zcm.adapter.*;

import java.util.*;

/**
 * @program: demo
 * @ClassName:OutUserInfo
 * @Description:
 * @Author:zcm
 * @Date:2021/2/20 15:18
 */
public class OutUserInfo implements IOutUserInfo {


    @Override
    public Map<String, String> getBaseUser() {
        Map<String, String> baseMap = new HashMap<>();
        baseMap.put("userName", "哪吒");
        baseMap.put("mobile", "15203021989");
        baseMap.put("sex", "男");
        baseMap.put("email", "15203021989@163.com");
        return baseMap;
    }

    @Override
    public Map<String, String> getHomeUser() {
        Map<String, String> homeMap = new HashMap<>();
        homeMap.put("address", "福州鼓楼融汇江山");
        homeMap.put("homeTel", "4009-80942314");
        return homeMap;
    }
}

interface IOutUserInfo {
    /**
     * @Description:基础信息
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/20 15:17
     */
    Map<String, String> getBaseUser();

    /**
     * @Description:家庭信息
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/20 15:16
     */
    Map<String, String> getHomeUser();

}



需要一个适配器外包公司的人员信息转成我们公司的存储形式

package com.zcm.adapter.entry;

import java.util.*;

/**
 * @Description:适配器:系统人员和外部人员一起查出来
 * @Author: zcm
 * @Version:v.2.7.1
 * @Date:2021/2/20 15:43
 */
public class OutUserAdapter extends OutUserInfo implements IUserInfo {
    /**
     * @Description:基础信息
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/20 15:38
     */
    Map<String, String> baseUser = super.getBaseUser();
    /**
     * @Description:家庭信息
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/20 15:38
     */
    Map<String, String> homeUser = super.getHomeUser();

    /**
     * @Description:关键转化方法
     * @Author: zcm
     * @Version:v.2.7.1
     * @Date:2021/2/20 15:38
     */
    @Override
    public List<User> getUserInfo() {
        List<User> users = new ArrayList<>();
        User user = new User();
        user.setUserName(baseUser.get("userName"));
        user.setSex(baseUser.get("sex"));
        user.setMobile(baseUser.get("mobile"));
        user.setEmail(baseUser.get("email"));
        user.setAddress(homeUser.get("address"));
        user.setHomeTel(homeUser.get("homeTel"));
        users.add(user);
        return users;
    }
}

查看转化结果

package com.zcm.adapter.entry;

import java.util.*;

/**
 * @program: demo
 * @ClassName:Client
 * @Description:
 * @Author:zcm
 * @Date:2021/2/20 15:09
 */
public class Client {
    public static void main(String[] args) {
        IUserInfo userInfo = new UserInfo();
        System.out.println("内部人员:---------------------------");
        List<User> info = userInfo.getUserInfo();
        info.forEach((user) -> {
                    System.out.println("姓名:" + user.getUserName());
                    System.out.println("性别:" + user.getSex());
                    System.out.println("手机号:" + user.getMobile());
                    System.out.println("邮箱:" + user.getEmail());
                    System.out.println("家庭地址:" + user.getAddress());
                    System.out.println("家庭电话:" + user.getHomeTel());
                }
        );
        System.out.println("外部人员:----------------------------");
        //适配器使用
        userInfo = new OutUserAdapter();
        userInfo.getUserInfo().forEach((user) -> {
                    System.out.println("姓名:" + user.getUserName());
                    System.out.println("性别:" + user.getSex());
                    System.out.println("手机号:" + user.getMobile());
                    System.out.println("邮箱:" + user.getEmail());
                    System.out.println("家庭地址:" + user.getAddress());
                    System.out.println("家庭电话:" + user.getHomeTel());
                }
        );
    }
}

 

关系图

总结:适配器就是两个本质一样的东西表现形式有所差别通过适配器的转化让双方都可以使用对方的东西。例如说:手机数据线中的转换头,安卓线可以通过苹果转换头,让苹果手机充电,苹果数据线也可以通过安卓转换头让安卓手机充电,转换头就是适配器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值