design pattern - Adapter
来源:互联网 发布:java continue 编辑:程序博客网 时间:2024/05/21 21:45
通常客户类(client class)通过类的服务器类(server class)的接口访问它提供的服务。服务器类可以提供客户类的功能需要,但有时它提供的接口却不是客户类所期望的。在这种情况下,要把现有的接口转化为客户类所期望的接口,这样才能保证对现有类的重用。适配器模式就是为这样的转换而设计的。适配器模式建议定义一个包装类来包装不兼容接口的对象。这个包装类指的就是适配器Adapter,被包装的对象就是适配者Adaptee。适配器(Adapter)提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者(Adaptee)的相应接口的调用。换句话说,当客户调用适配器类的方法时,在适配器类的内部调用适配者类的方法,这个过程对适配者类是透明的,客户并不直接调用适配者类的方法。请注意,此处所说的接口,并不是java语言中的接口类型,而是指一个类对外暴露的编程接口。
适配器总体可分为两类:类适配器(class adapter)和对象适配器(object adapter)
类适配器是通过继承适配者(Adaptee class)类实现的,另外类适配器实现客户类所需要的接口,当客户类对象调用适配者类的方法的时候,适配器内部调用它所继承的适配者类的方法。
对象适配器是包含一个适配者器的引用,与类适配器相同,对象适配器也实现了客户需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调用它所包含的适配者器的实例的适当方法。
对于适配器类在现实生活中有一个典型的例子,就是电压转换插座。各国都有自己的额定电压标准,所以当一个国家的电器带到另一个国家使用时,要使用转换插座才能让电器正常运行。比如美国电器的额定电压是120V,中国电器的额定电压是220V,以下示例就是一个对中国和美国电器之间实现电压转换的抽象。首先定义两个电器类的interface: ChineseAppliance和USAppliance。
package plugadpter;
public interface ChineseAppliance {
void powerOn(ChinesePlug cp);
}
package plugadpter;
public interface USAppliance {
void powerOn(USPlug up);
}
再定义两个插座类的interface: ChinesePlug和USPlug。两个电器接口中的powerOn方法,分别要用到ChinesePlug和USPlug对象作为参数。
package plugadpter;
public interface ChinesePlug {
public void chargeIn220V();
}
package plugadpter;
public interface USPlug {
public void chargeIn120V();
}
对于ChineseAppliance接口,写一个类ChineseTV来实现。对于USAppliance接口,写一个USFridge类来实现。同样对于ChinesePlug接口,写一个ChinesePlugInstance类实现。对于USPlug接口写一个USPlugInstance类实现。
package plugadpter;
public class ChineseTV implements ChineseAppliance {
public void powerOn(ChinesePlug cp){
cp.chargeIn220V();
System.out.println("ChineseTV is on");
}
}
package plugadpter;
public class USFridge implements USAppliance {
public void powerOn(USPlug up){
up.chargeIn120V();
System.out.println("USFridge is on");
}
}
package plugadpter;
public class ChinesePlugInstance implements ChinesePlug {
public void chargeIn220V(){
System.out.println("charge in volt 220");
}
}
package plugadpter;
public class USPlugInstance implements USPlug{
public void chargeIn120V(){
System.out.println("charge in volt 120");
}
}
最后我们要做的就是写Adapter类来实现两种电压间的转换。这里我们分别创建两种类型的Adapter即class adapter和object adapter来实现转换。ChinaToUSAdapter1和ChinaToUSAdapter2类实现把中国电压转换成美国电压,USToChinaAdapter1和USToChinaAdapter2类实现把美国电压转换成中国电压。
/*class Adapter aims to change the
* China standard voltage to US standard voltage
*/
package plugadpter;
public class ChinaToUSAdapter1 extends ChinesePlugInstance implements USPlug {
public void chargeIn120V(){
chargeIn220V();
}
}
/*object Adapter aims to change the
* China standard voltage to US standard voltage
*/
package plugadpter;
public class ChinaToUSAdapter2 implements USPlug {
private ChinesePlugInstance cpi = new ChinesePlugInstance();
public void chargeIn120V(){
cpi.chargeIn220V();
}
}
/*class Adapter aims to change the
* US standard voltage to China standard voltage
*/
package plugadpter;
public class USToChinaAdapter1 extends USPlugInstance implements ChinesePlug {
public void chargeIn220V(){
chargeIn120V();
}
}
/*object Adapter aims to change the
* US standard voltage to China standard voltage
*/
package plugadpter;
public class USToChinaAdapter2 implements ChinesePlug {
private USPlugInstance upi = new USPlugInstance();
public void chargeIn220V(){
upi.chargeIn120V();
}
}
最后我们写一个AdapterTester类来测试一下,这四个Adapter。
package plugadpter;
public class AdapterTester {
public static void main(String[]args){
USFridge usfridge = new USFridge();
//use class adapter
usfridge.powerOn(new ChinaToUSAdapter1());
//use object adapter
usfridge.powerOn(new ChinaToUSAdapter2());
ChineseTV chinesetv = new ChineseTV();
//use class adapter
chinesetv.powerOn(new USToChinaAdapter1());
//use object adapter
chinesetv.powerOn(new USToChinaAdapter2());
}
}
/*
output:
charge in volt 220
USFridge is on
charge in volt 220
USFridge is on
charge in volt 120
ChineseTV is on
charge in volt 120
ChineseTV is on
*/
- Design Pattern 11-Adapter
- C++ Design Pattern:Adapter
- [Design Pattern]:Adapter
- design pattern : Adapter
- design pattern - Adapter
- Design Pattern--Adapter
- Java design pattern: Adapter
- 一句话Design Pattern:Adapter
- Design Pattern - Structural Pattern - Adapter
- Design Pattern(6)-Adapter Pattern
- Design Pattern 6: Adapter Pattern
- Design Pattern - Adapter(C#)
- Design Pattern: Default Adapter 模式
- Design Pattern——Adapter
- design pattern——adapter
- Design Pattern: Adapter 模式 - Object Adapter
- Design Pattern: Adapter 模式 - Class Adapter
- Design pattern learning II: Adapter pattern
- 干得累死,并不见得老板就待见你?
- Windows 下IIS配置与Ftp服务搭建
- JBOSS 启动 加载 过程
- 验证码 代码
- 采用struts上传
- design pattern - Adapter
- 新手上路
- Dos下修改IP地址的bat脚本文件,在不同局域网切换IP地址
- AOC V24t详细介绍
- php中echo(),print(),print_r()的区别
- JBoss介绍
- 认识4G地址空间的局限----MMIO内存映射的问题
- 【求一高效算法,感兴趣的朋友可以来试试,高分】解决方案整理系列二
- 利用apache的poi生成可供客户端下载的excel文件