关于设计模式:百度工程师教你玩转设计模式适配器模式

79次阅读

共计 3140 个字符,预计需要花费 8 分钟才能阅读完成。

作者 | 北极星小组

在现实生活中,常常会遇到两个“对象”因为接口不兼容而不能一起工作的场景,这时须要第三者进行适配,如:国内的充电线插头不肯定实用国外的插座须要借助转接头、SD 卡无奈间接链接电脑须要借助读卡器、用直流电的笔记本电脑接交流电源时须要一个电源适配器等。

在软件设计中,须要开发的具备某种业务性能的组件在现有的组件库中曾经存在,但它们与以后零碎的接口标准不兼容,如果从新开发这些组件老本又很高,这时用适配器模式能很好地解决这些问题。

适配器模式 (Adapter Pattern):是指将某个类的接口转化成客户端冀望的另一个接口,次要目标是兼容性,让本来因接口不匹配不能工作的两个类能够协同工作。

△适配器示意图

适配器模式蕴含如下角色:

  • Target:指标抽象类,定义客户要应用的接口
  • Adapter:适配器类,将 Adaptee 的接口进行适配转换
  • Adaptee:适配者类,须要被转换接口的对象
  • Client:客户类,通过适配器接口 Target 去应用 Adaptee 的性能

△对象适配器

△类适配器

一、适配器模式在文档业务场景中的利用(对象适配器)

微软 office 文档有两种数据格式,即 office2007(OOXML 格局) 和 Office2003(二进制格局)。在新业务场景中,因现有零碎曾经具备 Office2007 文档解决性能组件(数据、阅读器等),当初须要在此基础上裁减反对 office2003 格局的文档。即复用现有的 office2007 组件类,但接口与复用环境要求不统一,此时能够应用适配器模式。

示例应用对象适配器形式,疏忽业务解决细节,仅做流程上的形象来表明适配器模式的应用,依据模式构造形象出各个角色类:

  • Doc2003 指标抽象类
  • Doc2007 适配者类
  • DocAdapter 适配器类
  • Document 客户类
// Document 客户类应用方
public class Document {public void View(Doc2003 doc) {doc.show()
  }
}

// Doc2003 接口形象
public interface IDoc2003 {void show();
}

// Doc2007 适配者类
public class Doc2007 {public void show() {System.out.println("office2007 规范解决流程");
    }
}

// DocAdapter 适配器类
public class DocAdapter implements IDoc2003 {
    private Doc2007 doc2007;
    public DocAdapter(Doc2007 doc2007){this.doc2007 = doc2007;}
    
    @Override
    public void show() {System.out.println("适配器:这里省略了适配到 2007 的一堆适配逻辑...");
        doc2007.show();}
}

// 测试类
public class Test {public static void main(String[] args) {Document document = new Document();
    Doc2003  doc2003 = new DocAdapter(new Doc2007()) ; 
    document.view(doc2003);
  }
}

二、适配器模式在替换依赖组件场景中的利用(类适配器)

在理论的研发过程中,咱们常常会须要对依赖组件进行更新迭代。在替换时,相干调用代码,往往散布在十分多的中央,并且因为调用办法与参数不统一,一一批改工作量大,且存在脱漏危险,这时候能够应用类适配器,将接口对立,缩小相干代码的改变。

示例应用类适配器形式,疏忽业务解决细节,仅做流程上的形象来表明适配器模式的应用,依据模式构造形象出各个角色类:

  • AHandler 指标抽象类
  • BHandler 适配者类
  • BAdapter 适配器类
  • Client 客户类
// 原依赖库 - 指标抽象类
public class AHandler {public void operation() {}}

// 新依赖库 - 适配者类
public class BHandler {public void action() {}}

// 适配器类
public class BAdapter extends BHandler {public void operation() {
        ...
        super.action();
        ...
    }
}

// 客户类
public class Client {public static void main(String[] args) {
        // 原调用
        AHandler aHandler = new AHandler();
        aHandler.operation();
        
        // 新调用
        BAdapter bAdapter = new BAdapter();
        bAdapter.operation();}
}

三、适配器模式在接口实现场景的利用(接口适配器)

在理论的开发过程中,一个接口有大量的办法,然而对应的不同类只须要关注局部办法,其余无关的办法全都实现过于繁琐,尤其是波及的实现类过多的状况。

例如,现有一个须要的指标接口对象 Target,定义了大量相干的办法。然而在理论应用过程只需别离关注其中局部办法,而不是全副实现。在此场景中:

被依赖的指标对象:TargetObj

适配器:Adapter

客户端:Client

// 指标对象:定义了大量的相干办法
public interface TargetObj {void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();}

// 适配器:将指标接口定义的办法全副做默认实现
public abstract class Adapter implements TargetObj {void operation1(){}
    void operation2(){}
    void operation3(){}
    void operation4(){}
    void operation5(){}
}

// 客户端:采纳匿名外部类的形式实现须要的接口即可实现适配
public class Client {public static void main(String[] args) {Adapter adapter1 = new Adapter() {
            @Override
            public void operation3() {
            // 仅仅实现须要关注的办法即可
            System.out.println("operation3")
            }
        }
        
        Adapter adapter2 = new Adapter() {
            @Override
            public void operation5() {
            // 仅仅实现须要关注的办法即可
            System.out.println("operation5")
            }
        }
        
        adapter1.operation3();
        adapter2.operation5();}

}

四、总结

以上介绍了三种应用适配器模式的场景,适配器模式实质上是将现有的不兼容的接口转换为须要的接口,不须要扭转原来的代码构造即可实现新的性能,通常实现形式上有:

  1. 对象适配器:通过对象的组合来达到适配目标;
  2. 类适配器:通过类的继承或者接口的实现来达到适配目标;
  3. 接口适配器:通过实现接口的形式转换来达到适配的目标;

适配器模式是在现有的类和零碎都不易批改的状况下应用,在零碎设计之初慎用适配器模式,这样会导致代码可读性变差,不易保护。

———- END ———-

举荐浏览【技术加油站】系列:

揭秘百度智能测试在测试评估畛域实际

百度工程师带你探秘 C ++ 内存治理(实践篇)

从零到一理解 APP 速度测评

百度工程师教你玩转设计模式(工厂模式)

揭秘百度智能测试在测试剖析畛域实际

百度用户产品流批一体的实时数仓实际

正文完
 0