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

前言

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

在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. 适配器模式为客户调用提供了一个统一的接口,使得客户的调用更简单更直接更紧凑
时间: 2024-08-02 22:01:37

设计模式系列之八:适配器模式的相关文章

C# 设计模式系列教程-适配器模式_C#教程

1. 概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 3. 模式中的角色 3.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 3.2 需要适配的类(Adaptee):需要适配的类或适配者类. 3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接

大话设计模式系列

原文:大话设计模式系列 1.设计模式之前奏(UML类图) 2.设计模式之一(单例模式) 3.设计模式之二(简单工厂模式) 4.设计模式之三(工厂方法模式) 5.设计模式之四(抽象工厂模式第一回合) 6.设计模式之四(抽象工厂模式 第二回合) 7.设计模式之四(抽象工厂模式 第三回合) 8.设计模式原则(单一.开放封 闭.里氏代换.依赖倒转.迪米特法则五大原则) 9.设计模式之五(策略模式) 10.设计模式之六(装饰模式) 11.设计模式之七(代理模式) 12.设计模式之八(原型模式) 13.设计

ASP.NET企业开发框架IsLine FrameWork系列之八--AppLogProvider日志框架(下)

上面的配置实例是按照将日志写入文本文件来配置的(节点具体含义见上文),程序调用 AppLogProvider时,需要进行实例化,在实例化过程中指定使用哪个Render,不同的实例对应不同的配置 信息,就可以对应不同的等级.记录介质,如下: 开发框架IsLine FrameWork系列之八--AppLogProvider日志框架(下)-"> 图 6 构造函数配置效果 如上图所示,使用前先实例化一个日志实例,实例化时有6中内置方式可以选择,我们刚配置了File节 点信息,所以在这里选择&quo

Android设计模式系列之工厂方法模式_Android

工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式. android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具管理类. 今天以ThreadFactory举例说明一下简单工厂模式和工厂方法模式. 工厂方法模式,Factory Method,简单的方式,不简单的应用. 1.意图 定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方式模式使一个类的实例化延迟到其子类. 热门词汇:虚构造器 延迟 创建对象

Android设计模式系列之组合模式_Android

Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类. 组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 1.意图 将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分). 组合模式使得用户对单个对象View和组合对象ViewGrou

Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程

原文:Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程 Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.2.0.1337 Edition 数据库比较工具 完全破解+使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214

BP算法双向传,链式求导最缠绵(深度学习入门系列之八)

更多深度文章,请关注:https://yq.aliyun.com/cloud 系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一)人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二)神经网络不胜语,M-P模型似可寻(深度学习入门系列之三)"机器学习"三重门,"中庸之道"趋若人(深度学习入门系列之四)Hello World感知机,懂你我心才安息 (深度学习入门系列之五)损失函数减肥

《网络品牌落地调查》系列之八

<网络品牌落地调查>系列之八 2012年4月,亿邦动力网研究中心对网络品牌的线下实体店进行了相关调研.结果显示,在部分知名网络品牌中,梦芭莎.麦考林.兰缪.钻石小鸟.珂兰钻石等过半数品牌已铺设实体店.其中,麦考林406家,梦芭莎19家,珂兰钻石23家,钻石小鸟12家,兰缪3家.该统计基本涵盖了各品牌的自营店和加盟店,部分规模较大的实体柜台也计算在内. 2011年,来自阿里巴巴的数据显示,网络品牌从线上走向线下的趋势十分明显.两年前,在淘宝十大服装品牌中,有9个没有实体店:到现在,十大服装品牌中

PHP 设计模式系列之 specification规格模式_php实例

1.模式定义 规格模式是组合模式的一种扩展,在框架性开发中使用较多(项目级开发很少使用),这里做一个简单的介绍. 规格模式(Specification)可以认为是组合模式的一种扩展.有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与.或.非)进行组合,从而灵活地对业务逻辑进行定制.另外,在查询.过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑. 这里的每个条件就是一个规格,多个规格/条件通过串联的