适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。

为何使用适配器模式

我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办?

使用Adapter,在这两种接口之间创建一个混合接口(混血儿)。

如何使用适配器模式

实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance),

假设我们要打桩,有两种类:方形桩 圆形桩。

public class SquarePeg{

public void insert(String str){

System.out.println("SquarePeg insert():"+str);

}

}

public class RoundPeg{

public void insertIntohole(String msg){

System.out.println("RoundPeg insertIntoHole():"+msg);

}

}

现在有一个应用,需要既打方形桩,又打圆形桩。那么我们需要将这两个没有关系的类综合应用,假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:

public class PegAdapter extends SquarePeg{

private RoundPeg roundPeg;

public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)

public void insert(String str){ roundPeg.insertIntoHole(str);}

}

在上面代码中,RoundPeg属于Adaptee,是被适配者。PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配。实际上这是将组合方法(composition)和继承(inheritance)方法综合运用。

PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码。

如果你有些Java使用的经验,已经发现,这种模式经常使用。

进一步使用

上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承,即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface):

public interface IRoundPeg{

public void insertIntoHole(String msg);

}

public interface ISquarePeg{

public void insert(String str);

}

下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别,和上面的没什么区别。

public class SquarePeg implements ISquarePeg{

public void insert(String str){

System.out.println("SquarePeg insert():"+str);

}

}

public class RoundPeg implements IRoundPeg{

public void insertIntohole(String msg){

System.out.println("RoundPeg insertIntoHole():"+msg);

}

}

下面是新的PegAdapter,叫做two-way adapter:

public class PegAdapter implements IRoundPeg,ISquarePeg{

private RoundPeg roundPeg;

private SquarePeg squarePeg;

// 构造方法

public PegAdapter(RoundPeg peg){this.roundPeg=peg;}

// 构造方法

public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)

public void insert(String str){ roundPeg.insertIntoHole(str);}

}

还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。

java adapter 模式_Java设计模式之适配器模式(Adapter模式)介绍相关推荐

  1. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  2. java的简单工厂模式_java设计模式之简单工厂模式

    简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. ...

  3. java 桥接模式_JAVA设计模式之【桥接模式】

    桥接模式 蜡笔中颜色和型号之间存在耦合 毛笔中,颜色和型号解耦了 如果软件系统中某个类存在两个独立变化的维度,桥接模式可以将两个维度分离出来 角色 抽象类 扩充抽象类 实现类接口 提供基本操作 抽象类 ...

  4. java 外观模式_Java设计模式11:外观模式

    外观模式 外观模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的外观对象进行.外观模式是一个高层次的接口,使得子系统更易于使用. 医院的例子 现代的软件系统都是比较复杂的.假如把医院比作一 ...

  5. java计数器策略模式_java设计模式(二十一)--策略模式

    对于策略模式,我在很多面试题上看到过考察这一类的问题,这种模式也的确比较好用. 我感觉这种模式就是将不同实现的方法放到一个接口中,然后通过实现这个接口来实现不同的运行结果,这种模式有三部分构成: 策略 ...

  6. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...

  7. 【设计模式】—— 适配器模式Adapter

    模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器 ...

  8. java设计模式adapter,java设计模式-适配器模式(Adapter)

    定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极 ...

  9. Java进阶专题(八) 设计模式之适配器模式、装饰者模式、观察者模式

    本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式.本章节参考资料书籍<Spring ...

最新文章

  1. 聊聊企业级 Java 应用最重要的4个性能指标
  2. js 日历插件开发
  3. 一文通俗讲解元学习(Meta-Learning)
  4. icd植入是大手术吗_白内障手术为何要植入人工晶体?便宜的人工晶体会影响视力吗?...
  5. 代码规范(一)——java篇
  6. 计算机网络学习笔记-1.1.3-速率相关的性能指标
  7. python分析工具有哪些_常用Python数据分析工具汇总
  8. DataView.RowFilter的使用(包括in,like等SQL中的操作符)
  9. 高等代数(邱维声):高等代数的研究对象
  10. 小程序源码:全新独立后台月老办事处一元交友盲盒-多玩法安装简单
  11. python根据url下载视频_Python爬取某视频并下载
  12. S2B2C做得好,功劳全在一件代发功能
  13. Matlab画一半实线一半虚线,PPT中怎么绘制一个一半实线一半虚线的圆?
  14. 激荡三十年(珍藏图文版)
  15. 科沃斯扫地机器人抓不转_科沃斯扫地机器人一边转一边不转什么原因 科沃斯扫地机器人常见...
  16. 物理机安装Centos7
  17. web 常见的攻击方式
  18. Quartus II 13.0波形仿真
  19. Oracle 10g的闪回机制
  20. 打印机服务无法启动 错误代码1068

热门文章

  1. 支付宝小程序面向个人开发者公测
  2. web前端教程:css实现容器高度适应屏幕高度
  3. 怎么在百度云上部署php文件,在百度云主机上部署thinkphp5.1的注意事项
  4. smote算法_支持向量机算法的可解释和可视化
  5. 嵌入式开发板02---点亮LED升级版
  6. PS Raw增效工具:Adobe Camera Raw13 for mac
  7. 广告清除:Adware Zap Browser Cleaner for mac
  8. 一年级学情分析计算机,小学一年级语文学情分析范文
  9. linux的i o模型,I/O模型的分类及简介
  10. Java笔记-ConcurrentLinkedQueue的基本使用和注意事项