设计模式——适配器模式

《Head First 设计模式》《设计模式之禅(第二版)》 学习笔记,码云同步更新中

如有错误或不足之处,请一定指出,谢谢~

目录

设计原则
设计模式

适配器模式(Adapter Pattern)

定义
  • 将一个接口转换成客户希望的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
优点
  • 可以让两个没有任何关系的类一起运行,让目标类和适配类实现解耦
  • 增加了类的透明性
  • 提高了类的复用度
  • 具有非常好的灵活性
使用场景
  • 系统需要使用已经投入使用的类,但这些类不符合需求
案例

原本系统中有本公司员工信息的IUserInfo接口和UserInfo实现类。
但有一天从外部借调了一批员工过来,他们的用户信息结构OuterUserInfo和我们并不一样。
现在需要列一张全部员工名单,这就需要用到适配器模式了。

代码
/**
 * 我司员工信息接口
 */
public interface IUserInfo {

    /**
     * 获取姓名
     * @return
     */
    public String getUserName();

    /**
     * 获取手机号码
     * @return
     */
    public String getMobilePhoneNumber();

    /**
     * 获取家庭住址
     * @return
     */
    public String getAddress();

    /**
     * 获取职位
     * @return
     */
    public String getPosition();
}

/**
 * 我司员工信息实现类
 */
public class UserInfo implements IUserInfo{

    @Override
    public String getUserName() {
        return "李四";
    }

    @Override
    public String getMobilePhoneNumber() {
        return "手机号码:188xxxxxxxx";
    }

    @Override
    public String getAddress() {
        return "家庭住址:xx市xx区xxxxx";
    }

    @Override
    public String getPosition() {
        return "职位:CEO";
    }
}

/**
 * 外部员工接口
 */
public class OuterUser {

    public Map<String, String> getBaseInfo() {
        HashMap<String, String> baseInfo = new HashMap<>();
        baseInfo.put("name", "张三");
        baseInfo.put("phone", "188xxxxxxxx");
        baseInfo.put("address", "xx市xx区");
        return baseInfo;
    }

    public Map<String, String> getOfficeInfo() {
        HashMap<String, String> officeInfo = new HashMap<>();
        officeInfo.put("position", "CEO");
        return officeInfo;
    }
}

/**
 * 适配器类
 */
public class OuterUserInfo implements IUserInfo {

    private OuterUser outerUser;

    public OuterUserInfo(OuterUser outerUser) {
        this.outerUser = outerUser;
    }

    @Override
    public String getUserName() {
        return outerUser.getBaseInfo().get("name");
    }

    @Override
    public String getMobilePhoneNumber() {
        return outerUser.getBaseInfo().get("phone");
    }

    @Override
    public String getAddress() {
        return outerUser.getBaseInfo().get("address");
    }

    @Override
    public String getPosition() {
        return outerUser.getBaseInfo().get("position");
    }
}

/**
 * 测试类
 */
public class Test {

    public static void main(String[] args) {

        ArrayList<IUserInfo> userList = new ArrayList<>();
        OuterUserInfo outerUserInfo = new OuterUserInfo(new OuterUser());
        UserInfo userInfo = new UserInfo();
        userList.add(outerUserInfo);
        userList.add(userInfo);


        for (IUserInfo iUserInfo : userList) {
            System.out.println(iUserInfo.getUserName());
        }


    }
}

结果:
    张三
    李四

结语

适配器模式其实很简单,但能够顺利实施依赖于整个项目一直很好地遵循着“依赖倒置原则”和“里氏替换原则”。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容