开发者社区> 阿靖哦> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

注意:

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


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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Java设计模式系列】适配器模式及适用场景详解(中)
【Java设计模式系列】适配器模式及适用场景详解
36 0
【Java设计模式系列】适配器模式及适用场景详解(上)
【Java设计模式系列】适配器模式及适用场景详解
62 0
线程 - Java 多线程编程(上)
线程 - Java 多线程编程(上)
69 0
线程 - Java 多线程编程(下)
线程 - Java 多线程编程(下)
25 0
Java多线程那些事,对Java并发编程2w余字的总结,超详细(从入门到完全掌握)
Java多线程那些事,对Java并发编程2w余字的总结,超详细(从入门到完全掌握)
81 0
java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。
70 0
五分钟带你玩转多线程(一)java多线程基础知识简介
线程概念 进程:是一个执行中的程序,如打开网易云音乐,网易云音乐就是一个进程 线程:是进程的组成,一个进程包含多个线程,是jvm最小调度单元。如网易云音乐听歌是一个线程,评价是一个线程。
52 0
+关注
阿靖哦
JAVA开发工程师
70
文章
65
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载