适配器设计模式初探(Java实现)
本篇随笔主要介绍Java实现设配器设计模式。
先来看下待解决的问题:
(图片转自http://blog.csdn.net/jason0539)
由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要使用的是两足插口,就需要适配器来进行转换。(适配器一面是三足插口,一面是两足插口)
适配器模式一般有两种实现方式: 1、类适配器 2、对象适配器。
先来看下类适配器的UML图:

客户端只能操纵 Target 接口的 Request 方法来进行需要的操作(当然这里就相当于调用 Request 方法使用 两足插口 进行充电)。而接口具体的实现类有两种,一种是调用 ConcreteTarget 的 Request 方法进行充电(在例子中相当于直接把 两足插口 插入到 两足插座 上,遗憾的是我们现在在欧洲,而欧洲是没有 两足插座 的,只有 三足插座 ,所以 ConcreteTarget 的Request方法我们是不能使用的)。还有一种是调用 Adaptee类 的 SpecificRequest 方法进行充电(这相当于使用 三足插座 进行充电,可是我们现在只有 两足插口 ,是不能将其插入到 三足插座 中进行充电的,换句话说,Adaptee 类的 SpecificRequest 方法我们无法直接调用),这时我们就需要用到 适配器类 Adapter 来将 Adaptee 类的 SpecificRequest 方法转化为我们可以调用的 Request 方法。
接下来看具体的代码实现:
interface Target {
void Request();//规定两足插头充电标准,必须插入两足插座
}
class Adaptee {
public void SpecificRequest() {
System.out.println("把三足插头插在我身上可以进行充电");
}
}
class Adapter extends Adaptee implements Target {
@Override
public void Request() {
// TODO Auto-generated method stub
//先调用父类的SpecificRequest方法,相当于把转换器的一头插在欧洲的三足插座上,
//另一头就可以给两足插头进行充电了
super.SpecificRequest();
System.out.println("把两足插头插在我身上可以进行充电");
}
}
public class Client {
public static void charge(Target target) {
//客户调用 Request 方法进行充电
target.Request();
}
public static void main(String[] args) {
Adapter ad = new Adapter();//在欧洲先买一个转换器
charge(ad);//利用转换器进行充电
}
}
运行结果:

可见两足插头也可进行充电。
2、对象适配器模式实现
UML图:

实现方式与类适配器实现方式大致相同,只不过将 Adapter 从 Adaptee 类继承 改为 Adapter 持有 Adaptee 类对象。
interface Target {
void Request();//规定两足插头充电标准,必须插入两足插座
}
class Adaptee {
public void SpecificRequest() {
System.out.println("把三足插头插在我身上可以进行充电");
}
}
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void Request() {
// TODO Auto-generated method stub
adaptee.SpecificRequest();
System.out.println("把两足插头插在我身上可以进行充电");
}
}
public class Client {
public static void charge(Target target) {
//客户调用 Request 方法进行充电
target.Request();
}
public static void main(String[] args) {
Adapter ad = new Adapter(new Adaptee());//在欧洲先买一个转换器并将其一端插入三足插座
charge(ad);//利用转换器进行充电
}
}
运行结果同上。
适配器设计模式一般用于系统后期扩展、修改。
参考文章:http://blog.csdn.net/ymeng_bupt/article/details/6833480
http://blog.csdn.net/jason0539/article/details/22468457
适配器设计模式初探(Java实现)的更多相关文章
- Java设计模式之适配器设计模式(项目升级案例)
今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...
- Java适配器设计模式
适配器设计模式,一个接口首先被一个抽象类先实现(此抽象类通常称为适配器类),并在此抽象类中实现若干方法(但是这个抽象类中的方法体是空的),则以后的子类直接继承此抽象类,就可以有选择地覆写所需要的方法. ...
- JAVA基础—适配器设计模式
适配器概念 在计算机编程中,适配器模式将一个类的接口适配成用户所期待的.使用适配器,可以使接口不兼容而无法在一起工作的类协调工作,做法是将类自己包裹在一个已经存在的类中. JDK对适配器设计模式的应用 ...
- [gkk]传智-适配器设计模式,如同电源适配器
//适配器设计模式 是图形化设计中用的.如同电源适配器 import java.awt.*; inport java.awte public calss MyFrame{ public static ...
- 【设计模式】Java设计模式 - 适配器模式
[设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...
- IOS设计模式第六篇之适配器设计模式
版权声明:原创作品,谢绝转载!否则将追究法律责任. 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScr ...
- 初探Java字符串
转载: 初探Java字符串 String印象 String是java中的无处不在的类,使用也很简单.初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是final的. 不过,String是 ...
- 常用的软件设计模式的Java实现——让编程从野生到飞起
常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩 https://www.bilibili.com/video/av7596511/
- Design Pattern Adaptor 适配器设计模式
适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...
随机推荐
- MySQL mysqldump备份与恢复
1 用户权限 grant select,RELOAD,PROCESS,SUPER, REPLICATION CLIENT ON *.* TO 'bak'@'192.168.%' IDENTIFIED ...
- Spring学习十 rest
1: Web service: 是一个大的概念范畴,它表现了一种设计思想 SOAP 是 Web service 的一个重要组成部份. SOAP 是一种协议而非详细产品.SOAP 是通过 XML ...
- [置顶]
getenv、setenv函数(获取和设置系统环境变量) 与 环境变量
1.getenv() 函数名: getenv 功 能: 从环境中取字符串,获取环境变量的值 头文件: stdlib.h 用 法:char *getenv(char *envvar); 函数说明:get ...
- linux下不用空格执行带参数的5种姿势
在搞安全的时候经常会遇到代码/命令执行,不能用空格的情况,总结了几种的绕过方法. 1.!! [root@iZ28wg1kditZ tmp]# pwd /tmp [root@iZ28wg1kditZ t ...
- suse 源的添加与删除,以及源地址
地址 一个是上海交大的,http://ftp.sjtu.edu.cn/opensuse/update/ 葡萄牙的: http://ftp.nux.ipb.pt/pub/dists/opensuse/u ...
- jQuery选择器整理
最使用近工作中常用到jQuery,在过滤器的使用方面生疏,所以本文整理了些有关知识点,以便于自己查找方便,或为朋友们提供方便! 一.基本选择器 $("#test") 选取id为te ...
- gridcontrol 添加行号
private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndic ...
- struts2学习笔记(3)struts.xml的一些常用设置
在开发中通常需要用到多个配置文件,可以通过在web.xml中添加以下代码: <include file="login.xml"></include> 将sr ...
- 《Android应用性能优化》 第6章 性能评测和剖析
1.时间测量 System.currentTimeMillis 精读和准确度可能不够:更改系统时间会影响结果:UTC时间1970/1/1 00:00:00到现在的毫秒数 System.nanoTime ...
- Solr各组件之间的关系图
原文地址:http://blog.csdn.net/clj198606061111/article/details/20854419