设计模式之适配器模式--- Pattern Adapter

模式的定义

适配器模式(Adapter Pattern)定义如下:

Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interface.

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

类型

结构类

模式的使用场景

如果你有动机修改一个已经投产中的接口时,适配器模式就可能是最适合你的模式

优点

  • 适配器模式可以让两个没有任何关系的类在一起运行,只要一个适配器就能够搞定
  • 增加类的透明性

    我们访问的Target目标角色,但是具体的实现都委托给了源角色,而这些对高层次模块是

透明的

  • 提高了类的复用度
  • 灵活性非常好

    如果不想用适配器,删除这个适配器就可以了,其他的代码都不要动,基本上就类似一个灵活的构件,想用就用,不想就删除。

类适配器

类适配器是通过继承进行的适配

类适配器UML类图

类适配器角色介绍

  • Target目标角色:

    该角色定义把其他类转换为何种接口,也就是我们期望的接口

  • Adaptee源角色

    你想把谁转换为目标角色,这个谁就是源角色,它是已经存在的,运行良好的类或对象,经过适配角色的包装,它会成为一个新的角色

  • Adapter适配器角色

    适配器模式的核心角色,其他两个角色都存在,而适配器角色是需要新建立的,它的职责:把源角色转换为目标角色,怎么转换?通过继承或是关联的方式。

类适配器模式的通用源码

Target 类:

public interface Target {

    public void request();
}

ConcreteTarget 类:


public class ConcreteTarget implements Target {

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("ConcreteTarget-----request()");
    }
}

Adaptee :


public class Adaptee {

    public void doSomeThing(){
        System.out.println("Adaptee-----doSomeThing()");
    }
}

Adapter :


public class Adapter extends Adaptee implements Target {

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("Adapter-----request()");
        super.doSomeThing();
    }

}

Client :


public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Target target = new ConcreteTarget();
        target.request();
        System.out.println("--------------------------");
        Target target2 = new Adapter();
        target2.request();
    }

}

类适配器输出结果

ConcreteTarget-----request()
--------------------------
Adapter-----request()
Adaptee-----doSomeThing()

对象适配器

对象适配器是通过对对象关联的方法进行的适配

对象适配器uml图

对象适配器通用源码

Target 类:

public interface Target {

    public void request();
}

ConcreteTarget 类:

public class ConcreteTarget implements Target {

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("ConcreteTarget-----request()");
    }
}

Adaptee01 类:

public class Adaptee01 {

    public void doAct01(){
        System.out.println("Adaptee01--------------doAct01()");
    }
}

Adaptee02 类:

public class Adaptee02 {

    public void doAct02(){
        System.out.println("Adaptee02--------------doAct02()");
    }
}

Adaptee03 类:

public class Adaptee03 {

    public void doAct03(){
        System.out.println("Adaptee03--------------doAct03()");
    }
}

Adapter 类:

public class Adapter implements Target {

    private Adaptee01 adaptee01;
    private Adaptee02 adaptee02;
    private Adaptee03 adaptee03;

    public Adapter(Adaptee01 adaptee01, Adaptee02 adaptee02, Adaptee03 adaptee03) {
        super();
        this.adaptee01 = adaptee01;
        this.adaptee02 = adaptee02;
        this.adaptee03 = adaptee03;
    }

    @Override
    public void request() {
        // TODO Auto-generated method stub
        System.out.println("Adapter-----request()");
        adaptee01.doAct01();
        adaptee02.doAct02();
        adaptee03.doAct03();
    }
}

Client 类:

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Adaptee01 adaptee01 = new Adaptee01();
        Adaptee02 adaptee02 = new Adaptee02();
        Adaptee03 adaptee03 = new Adaptee03();
        Adapter adapter = new Adapter(adaptee01, adaptee02, adaptee03);
        adapter.request();
    }

}

对象适配器输出结果

Adapter-----request()
Adaptee01--------------doAct01()
Adaptee02--------------doAct02()
Adaptee03--------------doAct03()

Android源码中的模式实现

杂谈

适配器模式本质就是把现有的类,对象,方法来包装成我们所需要的类和对象。

适配器模式是结构类,而从结构形式来包装现有的类一般有二种方式:

  • 一是继承的方式(is-a),这也就是类适配。
  • 一是关联的方式(have-a),这也就是对象适配。

参考资料

(1).设计模式之禅—第19章 适配器模式

(2)装饰模式

https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/adapter

时间: 2024-10-21 19:36:26

设计模式之适配器模式--- Pattern Adapter的相关文章

C#设计模式之六适配器模式(Adapter Pattern)【结构型】

原文:C#设计模式之六适配器模式(Adapter Pattern)[结构型] 一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[结构型]设计模式解决的是类和对象的组合关系的问题.今天我们就开始讲[结构型]设计模式里面的第一个设计模式,中文名称:适配器模式,英文名称:Adapter Pattern.说起这个模式其实很简单,在现实生活中也有很多实例,比

设计模式之适配器模式(Adapter Pattern)C++实现

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的. 何时使用: 1.系统需要使用现有的类,而此类的接口不符合系统的需要. 2.想要建立一个可以重复使用的类,用于与一些

C#设计模式(7)——适配器模式(Adapter Pattern)

一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将"将现存的对象"在新的环境中进行调用呢?解决这个问题的办法就是我们本文要介绍的适配器模式--使得新环境中不需要去重复实现已经存在了的实现而很好地把现有对象(指原来环境中的现有对象)加入到新环境来使用. 二.适配器模式的详细介绍 2.1 定义 下面让我们看看适配器的定义,适配器模式--把一个类的接口变换成客户端所期待的另一种接

设计模式之适配器模式(Adapter Pattern)

在正式开始之前,让我们先思考几个问题: 如果现有的新项目可以利用旧项目里大量的遗留代码,你打算从头开始完成新项目还是去了解旧项目的模块功能以及接口? 如果你了解过遗留代码之后,发现有几个重要的功能模块接口不同(因为它们可能来自多个旧项目),无法直接复用,你打算放弃使用遗留代码吗? 如果你不打算放弃(这样做应该是对的,毕竟遗留代码的正确性是经过实践检验的),那么是不是只能去改写剩余的n - 1个接口,甚至改写所有的n个接口? 如果不这样做,还有什么简单的方法吗? 一.什么是适配器模式? 首先,我们

设计模式:适配器模式(Adapter)

?适配器模式:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作. ?适配器模式有类适配器模式和对象适配器模式两种不同的形式. 类适配器 ?类适配器模式把适配的类的API转换成目标类的API ?适配器模式所涉及的角色: 目标角色(Target): 这就是所期待得到的接口. 源角色(Adaptee):需要适配的接口 适配器角色(Adapter):适配器类是本模式的核心.适配器把源接口转换成目标接口.显然,这一角色不可以是接口,而必须是具体

设计模式之适配器模式(Adapter)

我想要是说适配器模式,提一下"电压"."耳机"."充电器"和 "USB"  的例子应该是比较恰当的了.就说说自己的亲身经历,我原来的手机是NOKIA5730.后来也不知道有没有国行,但是不推荐大家买这款手机,不适用的哈.我买的时候只有港货,可是大家知道的啊,香港的充电器和我们大陆的充电器规格是不一样的,那我要是在国内充电,原机带的充电器根本用不了,所以要花25RMB买一个公牛的适配器,这样才可以充电!! 1.初识适配器模式 我

GOF23设计模式之适配器模式(Adapter)

一.适配器模式概述 将一个类的接口转换成客户可用的另外一个接口. 将原本不兼容不能在一起工作的类添加适配处理类,使其可以在一起工作. 二.适配器模式场景 要想只有USB接口的电脑想使用PS/2接口的键盘,必须使用PS/2转USB的适配器. 三.适配器模式示例 (1)定义USB接口 1 /** 2 * 客户所期待的接口(相当于USB接口) 3 * @author CL 4 * 5 */ 6 public interface Target { 7 8 void handleReq(); 9 10 }

浅谈JAVA设计模式之——适配器模式(Adapter)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45457903 一.概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,而它的接口不符合你的需求. 2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口 可能不一定兼容的类)协同工作. 3.(仅适用于对象Adapter)你想使用一些已经存

设计模式之适配器模式(Adapter Pattern)

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