zoukankan      html  css  js  c++  java
  • 适配器模式

    适配器模式

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

    例如: InputStreamReader(InputStream); 可以将字节流转为字符流, 这里就用到了适配器模式

    这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

    角色分析

    • 目标接口: 客户所期待的接口, 目标可以是具体的或抽象类, 也可以是接口
    • 需要适配的类: 需要适配的类或适配的类
    • 适配器: 通过包装一个需要适配的对象, 把原接口转化成目标对象

    案例

    思考

    如果我们有一台老电脑, 没有网线插槽, 只有USB的插槽, 这时候我们就需要使用一个网线适配器来让电脑可以使用网线上网

    现在我们就用代码来模拟一下这个适配器

    代码

    Adaptee类: 要被适配的类->网线

    public class Adaptee {
        // 上网
        public void request() {
            System.out.println("连接网线上网");
        }
    }
    

    NetToUsb类: 接口转换器的抽象实现

    public interface NetToUsb {
        // 作用: 处理请求, 网线=>USB
        public void handleRquest();
    }
    

    Adapter类: 真正的适配器, 需要连接USB, 连接网线

    public class Adapter implements NetToUsb {
    
        // 组合网线
        private Adaptee adaptee;
    
        // 构造器
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
        
        // 使用适配器连接网络
        @Override
        public void handleRquest( ) {
            adaptee.request(); // 可以上网了
        }
    }
    

    Computer类: 电脑类->想上网, 插不上网线

    public class Computer {
        // 我们的电脑需要连接上转接器才可以上网
        public void net(NetToUsb adapter) {
            // 上网的具体实现, 找一个转接头
            adapter.handleRquest();;
        }
    }
    

    main 方法实现

    public static void main(String[] args) {
        Computer computer = new Computer(); // 电脑
        Adaptee adaptee = new Adaptee(); // 网线
        Adapter2 adapter = new Adapter2(adaptee); // 转接器
    
        computer.net(adapter);
    }
    

    输出结果:

    连接网线上网
    

    代码结构图:

    优缺点

    优点

    • 一个对象适配器可以把多个不同的适配者适配到同一个目标
    • 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。

    缺点

    • 对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
    • 在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性

    适用场景

    • 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
    • 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  • 相关阅读:
    OpenStack Cinder组件支持的块存储设备表
    恒天云 3.0:打造基于OpenStack的私有云新模式
    看到一位园友博客有感
    android圆角功能,非常好用,可以用在图片,视频,gif等上面
    Android studio 3.0以上版本无法引入,找不到v4,v7包方案解决
    Android工程运用阿里freeline10秒快速编译分享
    Android监听view的attached或detached状态
    Android弹出Toast工具类总结
    为何IT开发人员如此辛苦?
    android TextView如何换行?
  • 原文地址:https://www.cnblogs.com/zpKang/p/13124272.html
Copyright © 2011-2022 走看看