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

  • 概述

  什么是适配器?在我们生活中的适配器比如插头转换器(中标转美标)、USB接口转换器(type-c转苹果),电脑电源适配器(交流电转低电压直流)等。像这种将两者有差异的东西通过适配器使他们成为相互适合的东西。在程序世界中,经常存在现有的程序无法直接使用,需要做适当的变换后才能使用的情况,这种用于填补“现有程序”和“所需程序”之间差异的设计模式就是适配器(Adapter)模式。适配器模式有类适配器模式和对象适配器模式两种,前者使用继承,后者使用组合,所以后者比较灵活,推荐使用。下面通过实例对这两种模式的学习做一个笔记。

  • 实例

  类适配器模式

  Banner类:代表现在的实际情况

/**
 * 注意:两种实现方式都是用的这个Banner类
 * 推荐使用对象适配器方式
 */
public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }

    /**
     * 用括号将字符串括起来
     */
    public void showWithParen(){
        System.out.println("("+string+")");
    }

    /**
     * 用星号将字符串括起来
     */
    public void showWithAster(){
        System.out.println("*"+string+"*");
    }
}

  PrintForClass接口:代表是“需求”的接口

public interface PrintForClass {
    public abstract  void printWeak();
    public abstract  void printStrong();
}

  PrintBannerForClass类:扮演适配的角色。

  实现目标接口(PrintForClass)达到适配目的,而继承被适配者类(Banner)达到通过调用被适配者里的方法来实现目标接口的功能。

public class PrintBannerForClass extends  Banner implements PrintForClass{

    public PrintBannerForClass(String string) {
        super(string);
    }

    //实现PrintForClass中的方法
    @Override
    public void printWeak() {
        super.showWithParen();
    }

    @Override
    public void printStrong() {
        super.showWithAster();
    }
}

  Main类:通过扮演适配器角色的PrintBannerForClass类来显示字符串。

  注意:这里我们将PrintBannerForClass类的实例保存在了PrintForClass类型的变量中。在这个类中,我们是使用PrintForClass接口来进行编程的。对Main类来说,Banner类、showWithParen()、showWithAster()方法被完全隐藏起来了。这就好像电脑电源适配器(交流电转低电压直流),电脑使用的是直流电,而它并不关心这个直流电是怎么来的。

public class Main {
    public static void main(String[] args) {
        //使用类适配器模式(继承)
        PrintForClass p = new PrintBannerForClass("Hello World!");
        p.printWeak();
        p.printStrong();
   }
}

  对象适配器模式(推荐)

  对象适配器模式就是采用一种“委托”的方式将某个方法中的实际处理交给其它实例来处理。在下面的例子中就是当PrintBannerForObject类中的printWeak()方法被调用的时候,并不是PrintBannerForObject类自己进行处理,而是将处理交给了Banner类的实例的showWithParen()方法。

  Banner类:和上面的Banner类一样

  PrintForObject类:不同于使用类适配器模式,这里使用的类,而类适配模式是使用的接口。

public abstract  class PrintForObject {
    public abstract  void printWeak();
    public abstract  void printStrong();
}

  PrintBannerForObject类:这个类中的banner字段保存了Banner的实例。然后printWeak()方法和printStrong()方法通过这个实例对象调用Banner类中的方法实现具体的功能。

public class PrintBannerForObject extends PrintForObject {
    private Banner banner;

    public PrintBannerForObject(String string) {
        this.banner = new Banner(string);
    }

    //实现PrintForObject中的方法
    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}
  • 完整代码

  请移步:https://github.com/yyc007/DesignPatterns/

  • 小结

  适配器模式就是将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。

  从用户的角度看不到被适配者,是解耦的;

  用户调用适配器转化出来的目标接口方法;

  适配器再调用被适配者的相关接口方法;

  用户收到反馈结果,感觉只是和目标接口交互。

原文地址:https://www.cnblogs.com/hyyq/p/10121446.html

时间: 2024-10-11 03:24:48

设计模式——适配器(Adapter)模式的相关文章

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

今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)>http://www.cnblogs.com/insus/archive/2013/02/04/2891426.html ,但是似乎没有适配器的味道. 比如一个系统,开发时设计好各种权限,但某一种,客户提出要求,需要一个特殊的权限来操作.只好开发一个适配器来让其有这个特殊操作权限. 用代码来举例吧. 先定

图解设计模式之Adapter模式

什么是Adapter模式  Adapter模式即适配器模式,对于适配器的理解参考现实生活中把交流电转换成直流电的电源适配器,用于填补现有的程序和所需的程序之间差异的设计模式就是Adapter模式,有以下两种实现方式: 1. 类适配器模式(使用继承的适配器) 2. 对象适配器模式(使用委托的适配器)所谓继承和委托的区别在哪呢?委托是指将某个方法中的实际处理交给其他实例的方法,继承则是自己进行处理,下面分别看下两种实现方式: 代码清单 这里有一个需要被适配的Banner类 /** * 被适配角色:交

设计模式之Adapter模式

说起Adapter,STL里的stack和queue都是adapter,底层是deque,隐藏了deque的一些接口,使得其可以达到FIFO是queue,LIFO是stack. The STL stack is a container adaptor. That is, it is not a "first-class" container, but instead simply "adapts" one of the sequential first-class

java演示适配器(adapter)模式

为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并实现了这个接口,这个接口中的方法在自己的类库中有更好的实现方式,但是方法名不一样,不能为用户所用,可以定义一个类实现这个接口,这个接口中的方法可以委托给自己类库中的方法实现效果,以满足客户的需求.这种方式叫做接口适配. // 已存在的.具有特殊功能.但不符合我们既有的标准接口的类 class Ada

Java 实现适配器(Adapter)模式

平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的.这个时候Adapter模式就会派上用场了 适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器 下面举例说明: 类适配器 类图 public class DrawRectangle {//画方 public void drawRectangle(String msg) {

设计模式-Adapter模式

最近在工作中遇到了一种场景,大概是这样:一个项目中,包含Widget(桌面小部件),它是由RemoteViews来渲染和实现的,而现在的需求是,要在应用程序里面对Widget上的字体大小和颜色进行设置,并且在应用里面能够看到变化,这就需要由View来渲染和实现.但是View和RemoteViews事两个不相关的类,他们渲染的方式完全不一样,但是我又不想重新写一套View的渲染代码,这就想到了Adapter模式. 意图 将一个类的接口转换成客户希望的另一个接口.Adapter模式使原本由于接口不兼

iOS常用设计模式——适配器Adapter

1.什么是适配器设计模式(Adapter)   (What) 适配器设计模式是一种结构型设计模式, 它的作用是把一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器设计模式有两种实现方式:1.)通过继承来实现两个接口,叫类适配器: 2.)通过引用来避免对象适配器继承被适配对象,叫对象适配器. 图1: 类适配器的UML图 在类适配器中,Adapter与Adaptee之间的关系是继承,我们通过继承来实现对Adaptee中+ specific

Java设计模式 —— 适配器(Adapter)

# 标签: 读博客 Adapter Pattern / Wrapper Pattern 什么时候需要适配,需要包装?肯定是你给我的,现有的服务提供的不好用,我才需要给你进行一下包装再用,或者适配之后再用. Android中,数据的list能直接放到view上面么?不能吧,所以搞了个adapter适配一下,变成了一个封装类,这个封装类是可以安在view上,或者说给view提供数据源的. 你笔记本电脑需要12V的直流电,但是你家里只有220V交流电或者110V交流电,所提供的,并不是所需的,不能直接

设计模式之Adapter模式(笔记)

适配器模式:将一个类的接口转移成客户希望的另外一个接口,此模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 首先定义一个目标接口ITarget public interface ITarget { public void request(); } 然后定义一个需要适配的类Adaptee public class Adaptee { public void specialRequest(){ System.out.println("特殊请求"); } } 接着定义一个Ada

设计模式 适配器-Adapter

适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 直接上图.下面是对象适配器的类图.由于Java不支持多继承.所以这是Java的适配器实现方式. 结合Head First例子:一个火鸡适配器 TurkeyAdapter实现Duck接口.里面有一个Turkey成员(Adaptee).