设计模式系列之八:适配器模式

简介:

前言

适配器模式与外观模式一样,也属于结构型模式。适配器所谓适配就是定义了一个外界希望的接口,从而使得原来不能工作的那些对象可以一起工作。在软件开发中,如果希望复用一些类,但是需要复用的类与复用环境不符的时候,需要使用适配器模式。更具体的说就是当前系统的行为与数据都正确但是接口不符这样就需要使用适配器模式。从设计角度讲,适配器模式耐无奈之举。这么说也很好理解,因为当需要复用一些类的时候,如果不希望更改外部接口也不希望更改内部系统的行为与数据,那么怎么办呢。前面的设计模式文章中提到开放-封闭原则,要完成功能的扩展必须要么修改原来的代码要么扩展现有的类,而现在这两个条件都不符合,所以只能添加一个额外的接口来适配了,所以可以这么理解,当双方的修改成本都很高的时候就考虑使用设配器接口来完成功能的对接。

在NBA比赛中,如果一个外籍球星加入NBA,而他又不懂英语,而且在短期学会英语也不是一件易事,NBA的其他球员也不懂他的语言,那么在这种情况下,最好的选择当然是找一个翻译比较省事了。而这个翻译就是这里提到的适配器了。

OK,那么就以NBA外籍球星,比如姚明,加入NBA比赛的场景用代码实现

编码实践

public class AdapterMode{

    //抽象球员类
    public abstract class Player{
        protected String name;
        public Player(){}
        public Player(String name){this.name = name;}
        public abstract void attack();
    }

    //本土球员
    public class NativeNBAPlayer extends Player{
        public NativeNBAPlayer(String name){super(name);}
        public void attack(){
            System.out.println("I am native NBA player, I am attacking!");
        }
    } 

    //外籍球员
    public class ForeignNBAPlayer extends Player{
        public ForeignNBAPlayer(){}
        public ForeignNBAPlayer(String name){super(name);}
        public void attack(){
            System.out.println("我是中国球星,我在攻击!");
        }
    }

    public class Translator{
        private String name;
        private Player foreignNBAPlayer;
        public Translator(String name,Player foreignNBAPlayer){this.name = name;this.foreignNBAPlayer = foreignNBAPlayer;}
        public void translatorAttack(){
            foreignNBAPlayer.attack();
        }

    }

    //测试代码
    public static void main(String[] args){
        AdapterMode am = new AdapterMode();

        Player nativeNBAPlayer = am.new NativeNBAPlayer("Kobe");
        Player foreignNBAPlayer = am.new ForeignNBAPlayer("姚明");

        nativeNBAPlayer.attack();
        Translator translator = am.new Translator("翻译管官",foreignNBAPlayer);
        translator.translatorAttack();
    }
}

测试结果:

测试结果

通过测试代码可以发现Adapter类很好完成了“翻译工作”,当然这只是测试代码,实际开发中可能是两个完全不相关的接口,而为了让这两个接口能够协同工作就可以使用“适配器”来进行接口的适配,这样两个完全不相关的接口就能共同完成一个目标了,这也是适配器存在的意义(在这个例子中,外籍球员与本土球员完成的共同目标是打篮球)。至此,我们就能够对适配器模式做一个简单的总结了:

  1. 适配器模式通过定义一个外界希望的接口使得原来不相关的类可以协同工作
  2. 当需要复用的类与复用环境差别较多的时候,可以考虑使用适配器模式
  3. 当需要协同工作的双方都不愿修改自身的代码或者双方修改的成本较大的时候,可以考虑使用适配器模式
  4. 适配器模式为客户调用提供了一个统一的接口,使得客户的调用更简单更直接更紧凑
目录
相关文章
|
7月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
116 4
|
7月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
114 4
|
9天前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
3月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
|
2月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
58 0
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
6月前
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
|
5月前
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式

热门文章

最新文章