适配器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模式的更多相关文章
-
漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比
1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方.首先两者都是属于结构型模式.结构型模型是这样定义的: 结构型模式涉及到如何组合类和类以获得更大的 ...
-
设计模式--适配器(Adapter)模式
今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...
-
适配器(Adapter)模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...
-
java演示适配器(adapter)模式
为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...
-
Java 实现适配器(Adapter)模式
平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...
-
设计模式C++描述----06.适配器(Adapter)模式
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...
-
2、适配器 adapter 模式 加个";适配器"; 以便于复用 结构型设计模式
1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...
-
Adapter(适配器)模式
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化. 例子1:iphone4,你即可以 ...
-
java设计模式—Adapter模式
1.核心意图: 将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...
随机推荐
-
Atitit 泛型原理与理解attilax总结
Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...
-
【PL/SQL练习】游标cursor :oracle 在执行sql语句时,为sql语句所分配的一个私有的内存区域
隐式游标:一次只能返回一行结果(不需要定义,默认自动建立) 显式游标: 需要开发人员提前定义,可以通过循环的方式处理游标里的sql语句,返回多行结果 隐式游标的属性: sql%rowcou ...
-
【微网站开发】之微信内置浏览器API使用
最近在写微网站,发现了微信内置浏览器的很多不称心的地方: 1.安卓版的微信内浏览器底部总是出现一个刷新.前进.后退的底部栏,宽度很大,导致屏幕显示尺寸被压缩 2.分享当前网站至朋友圈时,分享的图片一般 ...
-
image控件读取数据库二进制图片
DataGridShowImage.aspx <%@ Page language="c#" debug="true" Codebehind=" ...
-
android之针对fragment多次调用onCreateView的问题
private View rootView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup contain ...
-
取PE文件的引入表和导出表
直接上代码(这里列出C++和Delphi的代码),Delphi代码中包含导入及导出文件和函数列表,PE结构可参阅资料,很多很详细,需要注意的是,本例中是映射到内存,不是通过PE装载器装入的,所以对于节 ...
-
CF Codeforces Round #258 (Div. 2) B (451B)
题意:找出一段逆序! 预存a[]数组到b[]数组.将b排序,然后前后找不同找到区间[l,r],然后推断[l,r]是否逆序就能够了!.当然还得特判本身就是顺序的!! ! AC代码例如以下: #inclu ...
-
ios学习——键盘的收起
在开发过程中,我们经常会用到UITextField.UITextView等文本框,然后这些文本框在点击之后会自动成为第一响应者(FirstResponder),并自动弹出软键盘.然而,没有自动定义好的 ...
-
[luogu1168]中位数_优先队列
中位数 题目大意:输出读入的前2*k+1个数的中位数.一共有n个数,按照读入顺序. 注释:$1\le n \le 10^9$. 想法:这是优先队列的一个应用qwq.我们弄两个堆.小根堆和大根堆,保证: ...
-
HOW TO LINK THE TRANSACTION_SOURCE_ID TO TRANSACTION_SOURCE_TYPE_ID
In this Document Goal Solution References APPLIES TO: Oracle Inventory Management - Version 11 ...