设计模式——适配器模式

《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 getBaseInfo() {
        HashMap baseInfo = new HashMap<>();
        baseInfo.put("name", "张三");
        baseInfo.put("phone", "188xxxxxxxx");
        baseInfo.put("address", "xx市xx区");
        return baseInfo;
    }

    public Map getOfficeInfo() {
        HashMap 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 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());
        }


    }
}

结果:
    张三
    李四

结语

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

你可能感兴趣的:(设计模式——适配器模式)