JAVA设计模式--适配器模式

适配器模式
适配器可以借助生活的例子理解:你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行。
下面看看适配器的通用类图:

这里写图片描述

Target 是一个类(接口) ,Adaptee 是一个接口,通过 Adapter 把 Adaptee 包装成 Target 的一个子类(实现类)。适配器模式也称为包装模式。下面以一个具体的实例来研究适配器模式:
公司要扩展业务,需要增加一些外来员工,于是向其他公司借来了一些人员,这时候公司也要管理这些外来员工的信息。但是两个公司对员工的信息表定义却不一样。但是公司却要访问管理他们的员工信息,这时候适配器模式就可以派上用场了。先看本公司员工的类图:

这里写图片描述

外来人员信息的类图如下:

这里写图片描述

由于定义的类图不一致,即接口不统一,此时可以进行包装,引入适配器OuterUserInfo

这里写图片描述

于是乎在代码的设计上主要是
OuterUserInfo extends OuterUser implements IUserInfo
,这样就让外来员工的信息与本公司员工信息有相同的访问接口了。

外来员工:

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;
    }
}

在主类中调用:

    IUserInfo youngGirl = new OuterUserInfo(); 
    //从数据库中查训外员工信息
    for(int i=0;i<10;i++){
    youngGirl.getMobileNumber();

总结:

  1、 优点

    1.1 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

    1.2 复用了现存的类,解决了现存类和复用环境要求不一致的问题。

    1.3 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

    1.4 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

  2、 缺点

    对于对象适配器来说,更换适配器的实现过程比较复杂。

  3 、适用场景

    3.1 系统需要使用现有的类,而这些类的接口不符合系统的接口。

    3.2 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

    3.3 两个类所做的事情相同或相似,但是具有不同接口的时候。

    3.4 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

    3.5 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值