本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址。

适配器模式(别名:包装器)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

概述

适配器模式是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式,该模式中涉及有目标、被适配者和适配器。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。

适用性

1.你想使用一个已经存在的类,而它的接口不符合你的需求。

2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

参与者

1.Target 定义Client使用的与特定领域相关的接口。

2.Client 与符合Target接口的对象协同。

3.Adaptee 定义一个已经存在的接口,这个接口需要适配。

4.Adapter 对Adaptee的接口与Target接口进行适配

适配器模式的结构与使用

模式的结构中包括三种角色:

  • 目标(Target)

  • 被适配者(Adaptee)

  • 适配器(Adapter)

模式的UML类图:

实战部分

用户已有一个两相的插座,但最近用户又有了一个新的三相插座。用户现在已经有一台洗衣机和一台电视机,洗衣机按着三相插座的标准配有三相插头,而电视机按着两相插座的标准配有两相插头。现在用户想用新的三相插座来使用洗衣机和电视机。

1.目标(Target) : ThreeElectricOutlet.java

public interface ThreeElectricOutlet{
public abstract void connectElectricCurrent();
}

2.被适配者(Adaptee): TwoElectricOutlet.java

public interface TwoElectricOutlet{
public abstract void connectElectricCurrent();
}

3.适配器(Adapter): TreeElectricAdapter.java

public class TreeElectricAdapter implements ThreeElectricOutlet{
TwoElectricOutlet outlet;
TreeElectricAdapter(TwoElectricOutlet outlet){
this.outlet=outlet;
}
public void connectElectricCurrent(){
outlet.connectElectricCurrent();
}
}

4.应用 Application.java_1

public class Application{
public static void main(String args[]){
ThreeElectricOutlet outlet;
Wash wash=new Wash();
outlet=wash;
System.out.println("使用三相插座接通电流:");
outlet.connectElectricCurrent();
TV tv=new TV();
TreeElectricAdapter adapter=new TreeElectricAdapter(tv);
outlet=adapter;
System.out.println("使用三相插座接通电流:");
outlet.connectElectricCurrent();
}
}

4.应用 Application.java_2

class Wash implements ThreeElectricOutlet{
String name;
Wash(){
name="黄河洗衣机";
}
Wash(String s){
name=s;
}
public void connectElectricCurrent(){
turnOn();
}
public void turnOn(){
System.out.println(name+"开始洗衣物。");
}
}

4.应用 Application.java_3

class TV implements TwoElectricOutlet{
String name;
TV(){
name="长江电视机";
}
TV(String s){
name=s;
}
public void connectElectricCurrent(){
turnOn();
}
public void turnOn(){
System.out.println(name+"开始播放节目。");
}
}

适配器模式的优点

•目标(Target)和被适配者(Adaptee)是完全解耦的关系。

•适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。

您还可能感兴趣:

java设计模式系列:

java设计模式5--原型模式(Prototype)

java设计模式4--建造者模式(Builder)

java设计模式3--单例模式(Singleton)

java设计模式2--抽象工厂模式(Abstract Factory)

java设计模式1--工厂方法模式(Factory Method)

java设计模式0--设计模式简介

最新文章

  1. ios设备mdm的实现过程
  2. 自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析
  3. perl基础
  4. IntelliJ IDEA中使用综合使用Maven和Struts2
  5. POJ 2117 (割点+连通分量)
  6. a href 相对路径 与绝对路径
  7. 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个对立的元素存于vector中
  8. Beyond Compare 设置打开文件的默认编码
  9. android保存照片到相册的一些事
  10. java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象
  11. Calendar 时间日历简单例子
  12. HTML div 盒子 添加/删除——浮层
  13. C++Primer第五版——习题答案详解(六)
  14. _ZNote_Qt_定时器的总结
  15. netty 支持多种通讯协议
  16. 用Use Case获取需求的方法是否有缺陷,还有哪些地方需要改进
  17. 4.HTML字符集
  18. 【原创】MySQL 生产环境备份还原
  19. ArcGIS Javascript 图层事件绑定
  20. Python3之os模块

热门文章

  1. openssl asn.1 生成DER文件,把DER文件转换成内部数据结构
  2. 了解PHP中Stream(流)的概念与用法
  3. windows下重置mysql的root密码方法介绍(转)
  4. UWP数据分享
  5. JavaScript with JSONPath
  6. codevs 1230【pb_ds】
  7. WebLogic Server
  8. 最大流KK算法
  9. [BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)
  10. AHOI2018训练日程(3.10~4.12)