java设计模式-适配器模式

    适配器模式有两种类型,类适配器模式对象适配器模式。因为类适配器模式经过多重继承对一个接口与另外一个接口进行匹配,而C#、java等语言都不支持多重继承,于是这里只是介绍对象适配器。java

适配器模式官方定义

    将一个类的接口变换成客户端所期待的另外一种接口,从而使本来因接口不匹配而没法在一块儿工做的两个类可以在一块儿工做。ide

我的理解

    举个栗子,假如我如今有钱了,去巴厘岛去旅游。当地提供的住宿环境是那种欧式的插线板,但我手机充电器是中国通用的那种两个插线头。在这种状况下我手机已经没电了必需要充电,担我直接充不了怎么办。去当地的超市买来了一个转接头,拿回住的地方用转接头就能够充电了。网上这张图给我启发很大以下spa

    转接头(Adapter模式)使得本来因为插头与线板(接口)不兼容而不能一块儿充电(工做)的那些线(类)能够在一块儿工做。code

适配器模式中的角色

  • 目标接口(Target):客户所期待的接口。目标能够是具体的或抽象的类,也能够是接口。
  • 须要适配的类(Adaptee):须要适配的类或适配者类。
  • 适配器(Adapter):经过包装一个须要适配的对象,把原接口转换成目标接口。 

实现方法看看效果 

    公司如今是作本身产品(速),可是老板发现一个新的商机又开发出来一个新的产品(玩)。但愿在(玩)产品上同事能够看到(速)产品中的用户。但因为两个产品不是同一技术团队研发的。在技术与开发规范中都不是很统一。适配器模式就是要解决这样的问题对象

代码清单:(玩)用户信息接口继承

public interface IUserInfo {
    public String getUserName();
    public String getUserPhone();
    public String getUserJobPosition();
}

代码清单:(玩)用户信息实现方法接口

public class UserInfo implements IUserInfo {
    @Override
    public String getUserName() {
        System.out.println("张三");
        return null;
    }

    @Override
    public String getUserPhone() {
        System.out.println("15811111111");
        return null;
    }

    @Override
    public String getUserJobPosition() {
        System.out.println("CEO");
        return null;
    }
}

代码清单:(速)用户信息实现方法开发

public class Perpersonnel {
    public Map getUserBasic(){
        HashMap<Object, String> userBasic = new HashMap<Object, String>();
        userBasic.put("UserName","王五");
        userBasic.put("UserPhone","18811111111");
        return userBasic;
    }
    public Map getUserJob(){
        HashMap<Object, String> userJobPosition = new HashMap<Object, String>();
        userJobPosition.put("JobPosition","CTO");
        return userJobPosition;
    }
}

代码清单:主角适配器get

public class UserInfoAdapter extends Perpersonnel implements IUserInfo{
    public String getUserName() {
        String userName = (String) getUserBasic().get("UserName");
        System.out.println(userName);
        return userName;
    }
    public String getUserPhone() {
        String UserPhone = (String) getUserBasic().get("UserPhone");
        System.out.println(UserPhone);
        return UserPhone;
    }
    public String getUserJobPosition() {
        String JobPosition = (String) getUserJob().get("JobPosition");
        System.out.println(JobPosition);
        return JobPosition;
    }
}

代码清单:(玩)产品上查询两个产品的用户信息产品

public class Test {
    public static void main(String[] args) {
        IUserInfo iuserInfo = new UserInfo();
        iuserInfo.getUserName();
        iuserInfo.getUserPhone();
        iuserInfo.getUserJobPosition();

        System.out.println("---------------------");

        IUserInfo iuserInfoAdapter = new UserInfoAdapter();
        iuserInfoAdapter.getUserName();
        iuserInfoAdapter.getUserPhone();
        iuserInfoAdapter.getUserJobPosition();

    }
}

查询出来的结果以下:

张三
15811111111
CEO
---------------------
王五
18811111111
CTO

适配器模式的优缺点

优势

  • 适配器模式可让两个没有任何关系的类在一块儿运行,只要适配器这个角色可以搞定他们就成。
  • 增长了类的透明性
  • 提升了类的复用度
  • 灵活性很是好

缺点

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

适配器模式的使用场景

    适配器模式的使用场景主要记住一点就足够了:你想修改一个已经投产中的接口時,适配器模式多是最适合你的模式。

相关文章
相关标签/搜索