美文网首页Java设计模式程序员
设计模式之适配器模式

设计模式之适配器模式

作者: 于无声处写写写 | 来源:发表于2018-05-16 09:31 被阅读18次

定义

将一个类的接口,转换成客户希望的另一个接口,适配器让原本接口不兼容的类可以合作无间。

类图示例

image.png

生活举例

欧洲的电压跟中国的电压是不一样的,因此去欧洲旅行想要用欧洲的插座充电的话,就需要一个转换头。这个转换头所充当的其实就是适配器。欧洲的插座充当的就是被适配者,中国的标准电压就是目标。

几个概念

  • 客户:是依据目标接口实现的。
  • 适配器:适配器实现了目标接口,并持有被适配者的实例。
  • 被适配者:要进行转换的一方角色
    客户和被适配者是解耦的,相互之间不知道彼此

客户使用适配器的过程

  1. 客户通过目标接口调用适配器的方法对适配器发出请求
  2. 适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口
  3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用

代码举例

首先我们实现一个鸭子的接口,该接口中有quauk()和fly()两种方法

package adapterpattern;

public interface Duck {
    public void quack();
    public void fly();
}

接着创建一个绿头鸭子类,实现Duck接口

package adapterpattern;

public class MallardDuck implements Duck {
    @Override
    public void quack() {
        System.out.println("quack");
    }

    @Override
    public void fly() {

        System.out.println("fly");
    }
}

实现一个火鸡的接口,里面有gobble()和fly()两个方法

package adapterpattern;

public interface Turkey {
    public void gobble();

    public void fly();
}

创建一个野生火鸡类,该类实现了火鸡接口中的方法

package adapterpattern;

public class WildTurkey implements Turkey {
    @Override
    public void gobble() {
        System.out.println("Gobble gobble");
    }

    @Override
    public void fly() {

        System.out.println("turkey fly");
    }
}

现在想要用火鸡对象来冒充鸭子对象,但是因为火鸡和鸭子的接口不同,不能公然拿来用,所以此时需要写一个适配器
按照上文中的创建适配器过程,将进行以下步骤

package adapterpattern;

public class TurkeyAdapter implements Duck {
    Turkey turkey;
    public TurkeyAdapter(Turkey turkey) {
        this.turkey=turkey;
    }
    @Override
    public void quack() {

        turkey.gobble();
    }

    @Override
    public void fly() {

        turkey.fly();
    }
}

创建一个测试类

package adapterpattern;

public class DuckTestDrive {
    public static void main(String[] args) {
        MallardDuck duck=new MallardDuck();//先创建一只鸭子
        WildTurkey turkey=new WildTurkey();//和一只火鸡
        Duck turkeyAdapter = new TurkeyAdapter(turkey);
        System.out.println("The Turkey says..");
        turkey.gobble();
        turkey.fly();
        System.out.println("The duck says...");
        testDuck(duck);
        System.out.println("TurkeyAdapter says...");
        testDuck(turkeyAdapter);
    }

    static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }
}

运行结果

image.png

相关文章

  • 简说设计模式之适配器模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是适配器模式 适配器模式(Adapter...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 设计模式详解——适配器模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之适配器模式,Android设计模式源码解...

  • 设计模式之适配器模式

    设计模式之适配器模式 1. 模式定义 适配器模式又称包装器模式,属于结构型模式,它可以将一个接口转换成客户希望的另...

  • 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 适配器设计模式也并不复杂,适...

  • iOS设计模式(5)策略模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(6)模板模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(7)建造者模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(4)抽象工厂模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(1)简单工厂模式

    设计模式系列文章 《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器模式》《iOS设计模式(4)抽象工厂...

网友评论

    本文标题:设计模式之适配器模式

    本文链接:https://www.haomeiwen.com/subject/qdiudftx.html