设计模式之AdapterPattern适配器模式

在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。

通俗来讲,适配器就是一个中转站,把A模型转换为B模型。

适配器模式的定义与特点:

定义如下:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式对象结构型模式两种,类结构型模式类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

该模式的主要优点如下。
  1. 客户端通过适配器可以透明地调用目标接口。
  2. 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  3. 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
其缺点是:
对类适配器来说,更换适配器的实现过程比较复杂。

模式的结构与实现:

对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。现在来介绍它们的基本结构。

1、模式的结构:

适配器模式(Adapter)包含以下主要角色:

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。

  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

2、模式的具体实现:

A、目标(Target)接口:

public interface UserInfoInter {
    String getUserName();//获得用户姓名
    String getHomeAddress();//获得家庭地址
    String getMobileNumber();//手机号码,这个太重要,手机泛滥呀
    String getOfficeTelNumber();//办公电话,一般式座机
    String getJobPosition();//这个人的职位是啥
    String getHomeTelNumber();//获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作
}

B、适配者(Adaptee)接口(这个不是必须的,但最好是存在)

public interface OuterUserInter {    
    Map<String, String> getUserBaseInfo();//基本信息,比如名称,性别,手机号码了等    
    Map<String, String> getUserOfficeInfo();//工作区域信息
    Map<String, String> getUserHomeInfo();//用户的家庭信息
}

C、 适配者(Adaptee)类

public class OuterUser implements OuterUserInter{
    @Override
    public Map getUserBaseInfo() {
        HashMap<String, String> baseInfoMap = new HashMap();
        baseInfoMap.put("userName", "这个员工叫混世魔王....");      baseInfoMap.put("mobileNumber", "这个员工电话是....");
        return baseInfoMap;
    }
    @Override
    public Map getUserOfficeInfo() {
        HashMap<String, String> officeInfo = new HashMap();
        officeInfo.put("jobPosition","这个人的职位是BOSS...");       officeInfo.put("officeTelNumber", "员工的办公电话是....");
        return officeInfo;
    }
    @Override
    public Map getUserHomeInfo() {
        HashMap<String, String> homeInfo = new HashMap();
		 homeInfo.put("homeTelNumbner", "员工的家庭电话是....");      homeInfo.put("homeAddress", "员工的家庭地址是....");
        return homeInfo;
    }
}

D、适配器(Adapter)类

public class OuterUserInfo extends OuterUser implements UserInfoInter {
    private Map<String, String> baseInfo; //员工的基本信息
    private Map<String, String> homeInfo; //员工的家庭 信息
    private Map<String, String> officeInfo; //工作信息
    public OuterUserInfo(){
        baseInfo = super.getUserBaseInfo(); //员工的基本信息
        homeInfo = super.getUserHomeInfo(); //员工的家庭 信息
        officeInfo = super.getUserOfficeInfo(); //工作信息
    }
    @Override
    public String getUserName() {
        String userName = baseInfo.get("userName");        return userName;
    }
    @Override
    public String getHomeAddress() {
        String homeAddress =homeInfo.get("homeAddress");        return homeAddress;
    }
    @Override
    public String getMobileNumber() {
        String mobileNumber = baseInfo.get("mobileNumber");        return mobileNumber;
    }
    @Override
    public String getOfficeTelNumber() {
        String officeTelNumber = officeInfo.get("officeTelNumber");        return officeTelNumber;
    }
    @Override
    public String getJobPosition() {
        String jobPosition = officeInfo.get("jobPosition");        return jobPosition;
    }
    @Override
    public String getHomeTelNumber() {
        String homeTelNumber = homeInfo.get("homeTelNumber");        return homeTelNumber;
    }
}

E、客户端调用:

public class AdapaterPattern {
    public static void main(String[] args) {
        UserInfoInter userInfoInter = new OuterUserInfo();
        UserInfoBean userInfoBean = new UserInfoBean(userInfoInter.getUserName(), userInfoInter.getHomeAddress(), 
				userInfoInter.getMobileNumber(), userInfoInter.getOfficeTelNumber(), 
				userInfoInter.getJobPosition(),userInfoInter.getHomeTelNumber());
        System.out.println("AdapaterPattern.main:漂亮妹妹的信息--->>>" + userInfoBean.toString());
    }
}

F、用户信息Bean文件

public class UserInfoBean {
    private String userName, homeAddress, mobileNumbe, officeTelNumber, jobPositio, homeTelNumber;
    public UserInfoBean(String userName, String homeAddress, String mobileNumbe,
                        String officeTelNumber, String jobPositio, String homeTelNumber) {
        this.userName = userName;        		  this.homeAddress = homeAddress;
        this.mobileNumbe = mobileNumbe;        this.officeTelNumber = officeTelNumber;
        this.jobPositio = jobPositio;        		  this.homeTelNumber = homeTelNumber;
    }
    @Override
    public String toString() {
        return "UserInfoBean{" +
                "userName='" + userName + '\'' + ", homeAddress='" + homeAddress + '\'' +
                ", mobileNumbe='" + mobileNumbe + '\'' + ", officeTelNumber='" + officeTelNumber + '\'' +
                ", jobPositio='" + jobPositio + '\'' + ", homeTelNumber='" + homeTelNumber + '\'' +  '}';
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值