java适配器模式

简介: java适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

案例:

  • 定义机器接口和其具体实现的两个不同机器
/**
 * @author Gjing
 * 刷卡器
 **/
public interface CardMachine {
    /**
     * 刷身份证
     */
    void blushIdCard(String number);

    /**
     * 刷银行卡
     */
    void blushBankCard(String number);
}

/**
 * 身份证刷卡器
 */
class IdCardMachine implements CardMachine{

    @Override
    public void blushIdCard(String number) {
        System.out.println("身份证刷卡器执行刷卡,卡号:" + number);
    }

    @Override
    public void blushBankCard(String number) {

    }
}

/**
 * 银行卡刷卡器
 */
class BankCardMachine implements CardMachine {
    @Override
    public void blushIdCard(String number) {

    }

    @Override
    public void blushBankCard(String number) {
        System.out.println("银行卡刷卡器执行刷卡,卡号:" + number);
    }
}
  • 定义机器类型枚举
/**
 * @author Gjing
 * 定义机器类型
 **/
public enum  MachineType {
    /**
     * 刷卡器类型
     */
    ID_CARD,BANK_CARD;
}
  • 定义高级机器、处理器、外部插入口
/**
 * @author Gjing
 * 高级机器
 **/
public interface SuperMachine {
    /**
     * 刷卡
     */
    void blush(MachineType machineType, String number);
}

/**
 * 高级机器内部处理器
 */
class SuperMachineAdapter implements SuperMachine {
    @Override
    public void blush(MachineType machineType, String number) {
        switch (machineType) {
            case ID_CARD:
                CardMachine cardMachine = new IdCardMachine();
                cardMachine.blushIdCard(number);
                break;
            case BANK_CARD:
                cardMachine = new BankCardMachine();
                cardMachine.blushBankCard(number);
                break;
            default:
                throw new NullPointerException("没有找到合适机器");
        }
    }
}

/**
 * 高级机器提供给外部的刷卡口
 */
class SuperMachineOut implements SuperMachine {
    @Override
    public void blush(MachineType machineType, String number) {
        SuperMachineAdapter machineAdapter = new SuperMachineAdapter();
        machineAdapter.blush(machineType, number);
    }
}
  • 调用
/**
 * @author Gjing
 **/
public class Test {
    public static void main(String[] args) {
        SuperMachine superMachine = new SuperMachineOut();
        superMachine.blush(MachineType.ID_CARD, TimeUtil.localDateTimeToStamp(LocalDateTime.now())+"");
        superMachine.blush(MachineType.BANK_CARD, TimeUtil.localDateTimeToStamp(LocalDateTime.now())+"");
    }
}

应用场景:

适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作。从功能上说,这些接口不兼容的类一般具有相同或相似的功能。通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模式就会派上用场了。

优点:

1、将目标类和适配者类解耦
2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性.
3、灵活性和扩展性都非常好,符合开闭原则

缺点:

过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

注意:

适配器不是在详细设计时添加的,而是解决正在运行的项目的问题。


以上为个人见解,如有误欢迎各位指正

目录
相关文章
|
1月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
|
1月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
37 4
|
2月前
Servlet使用适配器模式进行增删改查案例(IDeptService.java)
Servlet使用适配器模式进行增删改查案例(IDeptService.java)
15 0
|
2月前
Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
14 0
|
2月前
Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
13 0
|
2月前
Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
14 0
|
2月前
Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
23 0
|
2月前
Servlet使用适配器模式进行增删改查案例(BaseDao.java)
Servlet使用适配器模式进行增删改查案例(BaseDao.java)
16 0
|
2月前
Servlet使用适配器模式进行增删改查案例(Dept.java)
Servlet使用适配器模式进行增删改查案例(Dept.java)
20 0
|
2月前
Servlet使用适配器模式进行增删改查案例(Emp.java)
Servlet使用适配器模式进行增删改查案例(Emp.java)
13 0