一、定义

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如以下的场景:

用手机充电为例,有一个手机的插孔是TypeC口,现在只有USB的数据线,这时候充电就需要一个转接口(Adapter类)来解决充电问题。

二、基本角色

  • 目标角色:这就是所期待得到的接口。比如上面的TypeC口
  • 源角色:现在需要适配的接口,比如上面的USB口。
  • 适配器角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。

三、示例程序

1、类适配器模式

通过继承来实现适配器功能。当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,然后再继承接口B的实现类C,这时我们在适配器P中的接口A方法中直接引用C中的合适方法,这样就完成了一个简单的类适配器。

新建目标角色:

public interface ITypeC {
void charge_typec();
}

新建源角色:

public interface IUsb {
void charge_usb();
}
public class Usb implements IUsb {
public void charge_usb() {
System.out.println("我是usb接口");
}
}

新建适配器:

public class Adapter  extends Usb implements ITypeC {
public void charge_typec() {
charge_usb();
}
}

测试:

public class Test {
public static void main(String[] args){
ITypeC iTypeC = new Adapter();
iTypeC.charge_typec();
}
}
我是usb接口

2、对象适配器模式

象适配器使用对象组合的方式,是动态组合的方式。当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,并且适配器要持有接口B的实例(不同于类适配器的地方),这时我们在适配器P中的接口A方法中调用接口B的实例的方法。

新建目标角色:

public interface ITypeC {
void charge_typec();
}

新建源角色:

public interface IUsb {
void charge_usb();
}
public class Usb implements IUsb {
public void charge_usb() {
System.out.println("我是usb接口");
}
}

新建适配器:(注意:这里是不同于类适配器模式的地方

public class Adapter implements ITypeC {
IUsb iUsb = null;
public Adapter(IUsb iUsb){
this.iUsb = iUsb;
}
public void charge_typec() {
iUsb.charge_usb();
} }

新建测试类:

public class Test {
public static void main(String[] args){
ITypeC iTypeC = new Adapter(new Usb());
iTypeC.charge_typec();
}
}
我是usb接口

类适配器和对象适配器的权衡

  • 类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
  • 对于对象适配器一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。

  • 对于类适配器适配器可以重定义Usb的部分行为,相当于子类覆盖父类的部分实现方法。

  • 对于对象适配器要重定义Usb的行为比较困难,这种情况下,需要定义Usb的子类来实现重定义,然后让适配器组合子类。虽然重定义Usb的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。

  • 对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Usb。

  • 对于对象适配器,需要额外的引用来间接得到Usb。

java常用设计模式六:适配器模式的更多相关文章

  1. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  2. Java设计模式06:常用设计模式之适配器模式(结构型模式)

    1. Java之适配器模式(Adapter Pattern) (1)概述:    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类,可以在一起 ...

  3. java常用设计模式

    一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我 ...

  4. JAVA常用设计模式整理

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

  5. java 常用设计模式(转载)

    http://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html 设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得 ...

  6. Java常用设计模式《转》

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

  7. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...

  8. Java常见设计模式之适配器模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...

  9. 基于JAVA的设计模式之适配器模式

    适配器模式概念 适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.比如我们突然就想看电影了,但是这个电影是AVI格式的,目前我们开发 ...

随机推荐

  1. SAP中的slashX

    SlashX /n This terminates the transaction. 关闭当前事务. /nxxxx This terminates the current transaction, a ...

  2. Android Studio无法打印Logout日志

    华为手机: 在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面,然后Project Menu → 后台设置 → LOG设置LOG 开关 → LOG 打开        LOG 级别设置 ...

  3. Mac下IntelliJ的Git、GitHub配置及使用

    1.git简介 Git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  4. supervisor 使用教程(转)

    原文地址:https://word.gw1770df.cc/2016-08-04/linux/supervisor-%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/ Supe ...

  5. 有关Oracle统计信息的知识点[z]

    https://www.cnblogs.com/sunmengbbm/p/5775211.html 一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如, ...

  6. Exploring the world of Android :: Part 1

    This blog is accidentally find out, it tells the story of one of our friends about the exploration o ...

  7. Django——模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  8. jquery分页插件精选

    1.最新的分页控件:Mricode.Pagination(推荐) https://github.com/mricle/Mricode.Pagination 2.Jquery Pagination Pl ...

  9. msysgit解决中文乱码问题

    项目中在用git,安装msysgit客户端后处理中文是有问题的: ls中文目录/文件名乱码:提交中文的log,push到服务器上会乱码:git log查看服务器pull过来的log乱码. 1.ls命令 ...

  10. linux 使用笔记1

    Zox's code life 人生就是不停的战斗! xxx is not in the sudoers file.This incident will be reported.的解决方法 1.切换到 ...