1.概念: 
  适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 
2.形式 
  a.类的适配器模式 b.对象的适配器模式 c.缺省适配器模式

3. 模式中的角色

  3.1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

  3.2 需要适配的类(Adaptee):需要适配的类或适配者类。

  3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 

4.适配器模式的类图

  4.1 类的适配器模式:采用继承实现

  4.2 对象的适配器模式:采用对象组合方式实现

  4.3 缺省适配器模式:采用抽象类过渡实现

5 类的适配器设计模式

类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口,在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。

  Interface : Target

package edu.gof.adapter.class_;

//目标接口,或称为标准接口
public interface Target { public void request();
}

  Class : Adaptee

package edu.gof.adapter.class_;

//已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class Adaptee { public void specificRequest(){
System.out.println("被适配的类具有的 特殊功能...");
} }

  Class : ConcreteTarget

package edu.gof.adapter.class_;

//具体目标类,只提供普通功能
public class ConcreteTarget implements Target { public void request() {
System.out.println("普通类 具有 普通功能...");
} }

  Class : Adapter

package edu.gof.adapter.class_;

//适配器类,继承了被适配类,同时实现标准接口
public class Adapter extends Adaptee implements Target{ public void request() {
super.specificRequest();
} }

  Class : AdapterTest

package edu.gof.adapter.class_;

public class AdapterTest {

    public static void main(String[] args) {
Target clientA = new ConcreteTarget();
clientA.request(); Target clientB = new Adapter();
clientB.request();
} }

  Console :

普通类 具有  普通功能...
被适配的类具有的 特殊功能...

6.对象的适配器设计模式

对象适配器模式,可以使得 Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能。

  Interface :Target

package edu.gof.adapter.object_;

public interface Target {

    public void request();
}

  Class : Adatee

package edu.gof.adapter.object_;

public class Adaptee {

    public void specificRequest(){
System.out.println("被适配类 具有 特殊功能...");
}
}

  Class :ConcreteTarget

package edu.gof.adapter.object_;

public class ConcreteTarget implements Target {

    public void request() {
System.out.println("普通类 具有 普通功能...");
} }

  Class : Adapter

package edu.gof.adapter.object_;

public class Adapter implements Target{
// 直接关联被适配类
private Adaptee adaptee; public Adapter() {
super();
}
// 可以通过构造函数传入具体需要适配的被适配类对象
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
} public void request() {
// 这里是使用委托的方式完成特殊功能
this.adaptee.specificRequest();
} }

  Class :AdapterTest

package edu.gof.adapter.object_;

public class AdapterTest {

    public static void main(String[] args){
Target clientA = new ConcreteTarget();
clientA.request(); Target clientB = new Adapter(new Adaptee());
clientB.request();
}
}

  Console :

普通类 具有 普通功能...
被适配类 具有 特殊功能...

7.缺省适配器设计模式

缺省适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。作为适配器模式的一个特例,缺省是适配模式在JAVA语言中有着特殊的应用。

  Interface :Target

package edu.gof.adapter.abstract_;

public interface Target {

    public void request();

    public void response();

}

  Class : AbstractTarget

package edu.gof.adapter.abstract_;

public class AbstractTarget implements Target{

    public void request() {
// TODO Auto-generated method stub } public void response() {
// TODO Auto-generated method stub }
}

  Class :Adapter

package edu.gof.adapter.abstract_;

public class Adapter extends AbstractTarget {

    public void request(){
System.out.println("适配器类 只适配 需要的 功能...");
}
}

  Class : AdapterTest

package edu.gof.adapter.abstract_;

public class AdapterTest {

    public static void main(String[] args){
Target clientA = new Adapter();
clientA.request();
clientA.response();
}
}

  Console :

适配器类 只适配 需要的 功能...

啦啦啦

啦啦啦

啦啦啦

GoF--适配器设计模式的更多相关文章

  1. Java适配器设计模式

    适配器设计模式,一个接口首先被一个抽象类先实现(此抽象类通常称为适配器类),并在此抽象类中实现若干方法(但是这个抽象类中的方法体是空的),则以后的子类直接继承此抽象类,就可以有选择地覆写所需要的方法. ...

  2. 猿取向的规划设计模式 ——GoF《设计模式》阅读摘要(零)

    这个话题是很奇怪,设计模式是引导程序的设计不是模仿什么软件?呃.我的意思是,这是 面"对象"相对的设计模式. 我曾见过有人写<给妻子解释设计模式>,这样的把计算机中的思 ...

  3. [gkk]传智-适配器设计模式,如同电源适配器

    //适配器设计模式 是图形化设计中用的.如同电源适配器 import java.awt.*; inport java.awte public calss MyFrame{ public static ...

  4. JAVA基础—适配器设计模式

    适配器概念 在计算机编程中,适配器模式将一个类的接口适配成用户所期待的.使用适配器,可以使接口不兼容而无法在一起工作的类协调工作,做法是将类自己包裹在一个已经存在的类中. JDK对适配器设计模式的应用 ...

  5. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...

  6. IOS设计模式第六篇之适配器设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScr ...

  7. 适配器设计模式初探(Java实现)

    本篇随笔主要介绍Java实现设配器设计模式. 先来看下待解决的问题: (图片转自http://blog.csdn.net/jason0539) 由上图的情况可知,欧洲壁式插座只有三足插口,如果我们想要 ...

  8. Design Pattern Adaptor 适配器设计模式

    适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...

  9. 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:迭代器模式>,作者:元闰子. 简介 有时会遇到这 ...

  10. php适配器设计模式

    <?php //适配器模式 //服务器端代码 class tianqi{ public static function show(){ $today= array('tep' =>28 , ...

随机推荐

  1. SpringBoot2 全局异常处理

    参考这篇文章里面的几种异常形式: 全局异常处理是个比较重要的功能,一般在项目里都会用到. 大概把一次请求分成三个阶段,来分别进行全局的异常处理. 一:在进入Controller之前,譬如请求一个不存在 ...

  2. webpack8--删除dist目录,压缩分离后的CSS

    一.删除dist目录 有时候我们需要在打包文件之前删除之前打包的dist目录,如何做? 1.安装new cleanWebpackPlugin(['dist']) npm install clean-w ...

  3. Javascript导航菜单13则

    来源:http://www.noupe.com/ajax/13-awesome-java-script-css-menu.html翻译:http://parandroid.com下面为你准备了13个利 ...

  4. 总结这两天连续干掉的bug In 创新实训 智能自然语言交流系

    临近项目合并,在pre合并中出现相当多的hug,遂记之 ps:这只是总结一下提纲,具体的方法在前文的博文中都详细记录.总结了. 平台的移植兼容性,虽然是跨平台的java,但是依旧有很多的意外: 1.从 ...

  5. Android 软键盘弹出与关闭监听

    private void listenerSoftInput() { final View activityRootView = findViewById(R.id.activityRoot); ac ...

  6. c数组

    一维数组 有三种赋值方式 1.原始的赋值 2. 初始化赋值 3.动态赋值 数组的花式玩法 void main() { ] = {, , , , , , , , , }; test(a); putcha ...

  7. Eclipse中配置resin 4.x

    开发web项目时,你还困扰在,反复启动web容器的痛苦中么?也许会有人说,用调试模式.但是如果涉及到配置文件或者service类,还是不得不重启web容器吧,而且偶尔会出现抽风情况,没生效的情况(这时 ...

  8. soapui-groovy脚本中文乱码及符号乱码、响应乱码解决方案

    groovy脚本中文乱码及符号乱码,解决方案: 响应乱码解决方案:

  9. Spring JDBC对象批量操作

    以下示例将演示如何使用spring jdbc中的对象进行批量更新.我们将在单次批次操作中更新student表中的记录. student表的结果如下 - CREATE TABLE student( id ...

  10. Lua------------------unity关于lua的使用

    关于Lua在Unity 中的使用   对于手机游戏,如果可以在线更新以实现bug修复.新功能添加等等,其好处自不必多说. 通过C#的反射机制,也可以实现某种程度上的脚本级更新,具体可以参考 http: ...