说说-设计模式之适配器模式

本文详细介绍了适配器模式的概念,包括对象适配器模式和类适配器模式的使用方法,通过具体案例展示了如何将不同接口的类进行适配,使它们能够协同工作,提高代码的复用性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适配器模式:将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

共有两类适配器模式:

对象适配器模式

-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

类适配器模式

-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 

百度百科

使用方法:继承和依赖

优点:

  • 可以让任何两个没有关联的类一起运行。
  • 增加了类的透明性。
  • 提高了类的复用度。
  • 灵活性非常好。

缺点:

  • 过多使用适配器,会使系统非常零乱。

 注意:通常使用适配器,是在现有的系统基础上,为了对现有系统不造成太大影响,但是也要兼容其他系统之间的对接任务,采用适配器模式,在两者之间搭建一个适配器,让彼此挂钩。

场景:有动机地修改一个正常运行的系统的接口。 

案例:找不到出处了,但是此处案例很容易理解这个模式。


1.类适配器模式  继承关系

 

/**
 * 把OuterUser包装成UserInfo
 * 类适配器
 */
public class OuterUserInfoAdaper 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;
    }
}

 2.对象适配器   依赖关系

/**
 * 把OuterUser包装成UserInfo
 * 对象适配器
 */
public class OuterUserInfoAdaper  implements IUserInfo {

    private OuterUser outerUser;

    public OuterUserInfoAdaper(OuterUser voltage220v) {
        this.outerUser = voltage220v;
    }

    /*
     * 家庭地址
     */
    public String getHomeAddress() {
        String homeAddress = (String) outerUser.getUserBaseInfo().get("homeAddress");
        System.out.println(homeAddress);
        return homeAddress;
    }

    /*
     * 家庭电话号码
     */
    public String getHomeTelNumber() {
        String homeTelNumber = (String) outerUser.getUserHomeInfo().get("homeTelNumber");
        System.out.println(homeTelNumber);
        return homeTelNumber;
    }

    /*
     *职位信息
     */
    public String getJobPosition() {
        String jobPosition = (String) outerUser.getUserOfficeInfo().get("jobPosition");
        System.out.println(jobPosition);
        return jobPosition;
    }

    /*
     * 手机号码
     */
    public String getMobileNumber() {
        String mobileNumber = (String) outerUser.getUserBaseInfo().get("mobileNumber");
        System.out.println(mobileNumber);
        return mobileNumber;
    }

    /*
     * 办公电话
     */
    public String getOfficeTelNumber() {
        String officeTelNumber = (String) outerUser.getUserOfficeInfo().get("officeTelNumber");
        System.out.println(officeTelNumber);
        return officeTelNumber;
    }

    /*
     * 员工的名称
     */
    public String getUserName() {
        String userName = (String) outerUser.getUserBaseInfo().get("userName");
        System.out.println(userName);
        return userName;
    }
}

公共部分:

/**
 * 外系统的人员信息
 */
@SuppressWarnings("all")
public interface IOuterUser {

    //基本信息,比如名称,性别,手机号码了等
    public Map getUserBaseInfo();

    //工作区域信息
    public Map getUserOfficeInfo();

    //用户的家庭信息
    public Map getUserHomeInfo();

}
/**
 * 自己系统的
 */
public interface IUserInfo {
    //获得用户姓名
    public String getUserName();
    //获得家庭地址
    public String getHomeAddress();
    //手机号码,这个太重要,手机泛滥呀
    public String getMobileNumber();
    //办公电话,一般式座机
    public String getOfficeTelNumber();
    //这个人的职位是啥
    public String getJobPosition();
    //获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作
    public String getHomeTelNumber();
}
/**
 * 外系统的用户信息的实现类
 */
@SuppressWarnings("all")
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 UserInfo implements IUserInfo {
    /*
     * 获得家庭地址,下属送礼也可以找到地方
     */
    public String getHomeAddress() {
        System.out.println("这里是员工的家庭地址....");
        return null;
    }
    /*
     * 获得家庭电话号码
     */
    public String getHomeTelNumber() {
        System.out.println("员工的家庭电话是....");
        return null;
    }
    /*
     * 员工的职位,是部门经理还是小兵
     */
    public String getJobPosition() {
        System.out.println("这个人的职位是BOSS....");
        return null;
    }
    /*
     * 手机号码
     */
    public String getMobileNumber() {
        System.out.println("这个人的手机号码是0000....");
        return null;
    }
    /*
     * 办公室电话,烦躁的时候最好“不小心”把电话线踢掉,我经常这么干,对己对人都有好处
     */
    public String getOfficeTelNumber() {
        System.out.println("办公室电话是....");
        return null;
    }
    /*
     * 姓名了,这个老重要了
     */
    public String getUserName() {
        System.out.println("姓名叫做...");
        return null;
    }
}

测试:

public class Client {
    public static void main(String[] args) {
       //没有与外系统连接的时候,是这样写的
        //IUserInfo youngGirl = new UserInfo();
        //老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点
        IUserInfo youngGirlClass = new OuterUserInfoAdaper(); //我们只修改了这一句好  类适配器
        //从数据库中查到101个
        for (int i = 0; i < 101; i++) {
            youngGirlClass.getMobileNumber();
        }
        System.out.println("----------------------------------------");
        IUserInfo youngGirlObject = new Adapter.Objectadapter.OuterUserInfoAdaper(new OuterUser()); //我们只修改了这一句好 对象适配器
        for (int i = 0; i < 101; i++) {
            youngGirlObject.getMobileNumber();
        }
    }
}

 

Java设计模式是一种被广泛应用于Java编程语言中的软件设计模式,它们是经过验证的最佳实践,可以帮助开发人员解决常见的设计问题,提高代码的可重用性、可维护性和灵活性。 以下是常见的Java设计模式: 1. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。 2. 工厂模式(Factory Pattern):定义一个用于创建对象的接口,但让子类决定实例化哪个类。 3. 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。 4. 建造者模式(Builder Pattern):将一个复杂的对象构建过程分解为多个简单对象的组合。 5. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。 6. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,而不需要修改这个对象的类。 7. 观察者模式(Observer Pattern):定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。 8. 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并使它们可以互换。 9. 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。 10. 适配器模式(Adapter Pattern):将一个类的接口转换为客户希望的另一个接口,使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。 这些设计模式可以帮助Java开发人员更好地组织和设计他们的代码,提高代码的可读性和可维护性,并增加代码的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值