适配器Adapter模式

适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

模式所涉及的角色有:

  • 目标(Target)角色:这就是用户所期待得到的接口。
  • (Adaptee)角色:现有需要适配的接口
  • 适配器(Adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以使接口,而必须是具体类。

下面以一个例子来说明适配器模式:

假设系统是一个银行系统,只提供取款功能,目前只有两个类:

类:BankAdaptee

public class BankAdaptee {

/**

 * 银行提供人民币业务

 */

public void withdrawRMB(){

System.out.println("本银行只提供人民币业务");

}

}

  

类:Client

public class Client {

public static void main(String[] args) {

BankAdaptee orignal = new BankAdaptee();

orignal.withdrawRMB();

}

}

通过运行Client类可查询出该银行现有的业务,结果如下所示:

那么,我如果想要在不改变原来系统的功能下让该银行实现对于美元、日元的业务处理呢?看代码:

添加接口:Target,该接口中指定用户想要实现的功能

/**

 * 

 * 该接口中抽象出客户想要实现的功能

 *

 */

public interface Target {

/**

 * 银行对于人民币业务的处理

 */

void withdrawRMB();

/**

 * 银行对于美元业务的处理

 */

void withdrawDollar();

/**

 * 银行对于日元业务的处理

 */

void withdrawJPY();

}

  

添加适配器Adapter:

public class BankAdapter extends BankAdaptee implements Target{

@Override

public void withdrawDollar() {

System.out.println("通过适配器模式,银行新增有美元业务");

}

@Override

public void withdrawJPY() {

System.out.println("通过适配器模式,银行新增有日元业务");

}

}

修改Client类:

public class Client {

public static void main(String[] args) {

/*BankAdaptee orignal = new BankAdaptee();

orignal.withdrawRMB();*/

BankAdapter now = new BankAdapter();

now.withdrawRMB();

now.withdrawJPY();

now.withdrawDollar();

}

}

运行结果如下所示:

通过以上例子是不是发现,我们只需要在系统中重新添加代码而不需要修改系统中的代码了,是不是通过这种适配器模式很好地增加了系统的可维护性、重塑性呢。

【原】模式之-适配器Adapter模式的更多相关文章

  1. 漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比

    1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方.首先两者都是属于结构型模式.结构型模型是这样定义的: 结构型模式涉及到如何组合类和类以获得更大的 ...

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

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  3. 适配器(Adapter)模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...

  4. java演示适配器(adapter)模式

    为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...

  5. Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...

  6. 设计模式C++描述----06.适配器(Adapter)模式

    一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...

  7. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  8. Adapter(适配器)模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  9. java设计模式—Adapter模式

    1.核心意图:     将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...

随机推荐

  1. php 用户验证的简单示例

    发布:thebaby   来源:net     [大 中 小] 本文介绍下,在php中,进行用户登录验证的例子,这个是基于WWW-Authenticate登录验证的实例,有需要的朋友参考下吧. 大家是 ...

  2. platform_driver_register()--如何match之后调用probe

    int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_t ...

  3. cx_Oracle ORA-24315: 非法的属性类型的解决办法

    网上查找原因说: 出现该错误的原因是因为版本不兼容. 检查了一下python版本和oracle 的版本,我的oracle client是10g的,python的版本是2.7, 但我安装的cx_orac ...

  4. 判断触摸的点在那个 View上

    UIView *touched = [self.view hitTest:pt withEvent:event]; Uiview *touchView = [pt  view];

  5. UIApplication sharedApplication 的常用使用方法-b

    下面是这个类的一些功能:1.设置icon上的数字图标 //设置主界面icon上的数字图标,在2.0中引进, 缺省为0 [UIApplicationsharedApplication].applicat ...

  6. ios音频视频资料--备用

    视频播放 MediaPlayer.framework MPMoviePlayerViewController VS MPMoviePlayerController MPMoviePlayerViewC ...

  7. hdu 1560 DNA sequence(搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others)  ...

  8. ruby的gem和boundle安装解决办法

    gem和boundle安装在国内被墙,淘宝提供了淘宝提供了RubyGems的国内镜像站点,解决办法是: 对于gem: $ gem sources --remove https://rubygems.o ...

  9. 基于jQuery的上下左右无缝滚动应用(单行或多行)

    $(function(){     var _wrap=$('ul.line');//定义滚动区域     var _interval=2000;//定义滚动间隙时间     var _moving; ...

  10. SecureCRT+WinSCP 共用 key pub 密钥 转换 ppk 登录ssh

    使用SecureCRT生成的密钥,无法在WinSCP使用, 使用puttygen.exe无法直接转换,解决办法 1.使用大于等于SecureCRT6.5版本,来转换 记得放入私钥,不是pub公钥.然后 ...