java常用设计模式六:适配器模式
一、定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。比如以下的场景:
用手机充电为例,有一个手机的插孔是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常用设计模式六:适配器模式的更多相关文章
- java常用设计模式总览
一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...
- Java设计模式06:常用设计模式之适配器模式(结构型模式)
1. Java之适配器模式(Adapter Pattern) (1)概述: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类,可以在一起 ...
- java常用设计模式
一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我 ...
- JAVA常用设计模式整理
设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...
- java 常用设计模式(转载)
http://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html 设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得 ...
- Java常用设计模式《转》
设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...
- JAVA常用设计模式(一、单例模式、工厂模式)
JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map; /** * 设计模式之单例模式 * 单例模式(Singleton Patte ...
- Java常见设计模式之适配器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
- 基于JAVA的设计模式之适配器模式
适配器模式概念 适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.比如我们突然就想看电影了,但是这个电影是AVI格式的,目前我们开发 ...
随机推荐
- CQ3
super.bark(); 不要第一个括号 Write a concrete meow( ) method 抽象类实例化后要加一个实例化的方法. 抽象类里可以没有抽象方法. What does ...
- swift - 闭包 -定义和使用
方法一: 1.定义 typealias OpenOrderSuccessResultBlock = ( _ dataArray:[String])->Void 2.类方法实现属性 var bac ...
- linux 备忘录
1. ps aux|grep 程序 -------->查看当前程序是否运行 ps aux|grep nginx 2. tar -zxvf 压缩包 ---------> 解压缩 tar -z ...
- 测试SD卡读写速度
执行测试命令之前,一定先清除缓存:# echo 3> /proc/sys/vm/drop_caches SD卡读取的速度# echo 3> /proc/sys/vm/drop_caches ...
- GridView创建菜单栏
GridView(网格视图)可以用来做九宫图.表格(行列)的视图,因其是网格状的,不用去调整权重,而且单个item可以自定义,因此也可以用来创建菜单栏(图标加文字形式),布局就一个GridView. ...
- docker-ce-17.09 网络基础配置
一.端口映射实现访问容器 1.我们先从pull一个nginx镜像,然后后台运行该镜像 > docker pull nginx > docker run -d -P nginx:latest ...
- zh-cn 与 zh-hans 是什么关系、有什么区别
回答一: 作者:知乎用户 链接:https://www.zhihu.com/question/21980689/answer/19923726 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权 ...
- 10.19JS日记
1.函数 关键词(function) var是js的关键字,用于声明变量,声明在内存模块完成,定义(=)是在执行模块完成 var可以在内存模块提前完成(js代码执行前),所以有变量提升这个功能 c ...
- Windows cordova build Error: Could not find gradle wrapper within Android SDK.(转)
原文:http://blog.csdn.net/kongxx/article/details/68954151 在Windows7上运行 “cordova build Android” 报错,如下: ...
- ZBlog你选择PHP还是ASP?
最近趁着空闲玩了一下zblog,对于很多第一次接触zblog的博主大多都会问zblog是PHP好还是ASP好?我们应该如何选择?其实,对于这个问题我也不是很懂,我个人比较倾向于PHP.今天我就整理一下 ...