`
砺雪凝霜
  • 浏览: 152031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式——适配器模式

阅读更多

1 概念

   适配器模式把一个类的接口变换成客户端期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的俩个类能够在一起
工作。
    这很像变压器(adapter),变压器把一种电压变换成另一种电压,把美国的电器拿回中国大陆来用的时候,用户就面临电压不同的问题美国的生活用电电压是110V,而中国的电压是220V。如果要在中国实用在美国的电器,就必须有一个能把220V电压转换成110V电压的变压器。而这正像本模式所做的事,因而次模式也常常被称为变压器模式。

2 适配器模式的分类

 适配器模式有类的适配器模式和对象的适配模式2种不同的形式。
 类的适配器模式
类的适配器模式把适配的类的api转换成为目标类的api
模式所涉及的角色有:
  • 目标(target)角色:这就是所期待的接口,注意由于这里讨论的是类的适配器模式,目标不可以是类
 Tsocket(插座)是一个接口,默认只能提供220V的电压,但是我们希望它还能提供110V的电压供美国电器使用、
  • 源(source)角色:现有需要适配的类

Appliance(美国电器)是一个类,只能使用110V的电压,但是220V的电压是不能使用的,如果非要给美国电器加上220v的电压使用,可能直接就炸了。O(∩_∩)O
  • 适配器(adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然这一角色不可是接口,而必须是类。
Adapter(变压器)是一个类,它继承了Appliance(美国电器)类,并实现了Tsocket (插座)接口它可以将把110V的电压变到220V,300V,400V,牛逼的可以到10000V

类的适配器模式demo

4.1 定义Tsocket接口

package com.liuyu.target;
/**
* Tsocket(插座)对象作为定为一个接口
* target:既可以提供110v的电压,又可以提供220v的电压
* @author Mrliu
*
*/
    publicinterfaceTsocket{
    publicvoid using110V();
    publicvoid using220V();
}
 

4.2 新建一个Appliace对象

package com.liuyu.source;
/**
* 美国电器只能使用110V的电压工作
* @author Mrliu
*
*/
    publicclassAppliance{
    publicvoid workingIn110V(){
    System.out.println("=== Appliance is working in 110v ===");
}
 
}
 

4.3 新建一个adapter类,继承Appliance对象,还实现了Tsocket接口

package com.liuyu.adapter;
 
import com.liuyu.source.Appliance;
import com.liuyu.target.Tsocket;
/**
* Adapter继承了Applance类,又实现了Tsocket接口,适配后既可以提供110V的电压,又可以提供220V的电压
* @author Mrliu
*
*/
publicclassAdapterextendsApplianceimplementsTsocket{
 
@Override
    publicvoid using110V(){
    this.workingIn110V();//调用Appliance的using110V()方法
}
 
@Override
    publicvoid using220V(){
    System.out.println("====经过adapter变压后,美国电器可以正常运转了 ===");
}
 
}
 

4.4 主函数

import com.liuyu.adapter.Adapter;
    publicclassTestAdapter{
    publicstaticvoid main(String[] args ){
    Adapter adapter =newAdapter();
    adapter.using110V();
    adapter.using220V();
}
}
 
 
运行结果:

5 对象适配器模式

     使用一个具体类把源(Appliance-美国电器)适配到目标(Tsocket-插座)中,这样一来如果适配Appliance(美国电器)的子类,美国电器可能有带三孔插座的、带二孔插座的,这次可能适配的带二孔的,下次就要适配带三孔的。这样就很不方便了,这个时候可以把美国电器的父类作为adapter的成员变量来处理。
    在类的适配器模式中,adapter是继承Appliance类的,在对象的适配器模式中,为了能适配Appliance的子类,appliance没有
作为adapter的父类来处理,而是作为adapter的成员类来处理的。现在adapter的源码如下所示:
package com.liuyu.adapter;
 
import com.liuyu.source.Appliance;
import com.liuyu.target.Tsocket;
/**
* Adapter继承了Applance类,又实现了Tsocket接口,适配后既可以提供110V的电压,又可以提供220V的电压
* @author Mrliu
*
*/
publicclassAdapterimplementsTsocket{
privateApplianceappliance; //电器的父类,这里偷下懒,意思意思一下,就当做是所有美国电器的父类
 
publicAppliance getAppliance(){
    return appliance;
}
 
publicvoid setAppliance(Appliance appliance){
    this.appliance = appliance;
}
 
@Override
    publicvoid using110V(){
    appliance.workingIn110V();//调用Appliance的using110V()方法
}
 
@Override
publicvoid using220V(){
    System.out.println("====经过adapter变压后,美国电器可以正常运转了 ===");
}
 
} 
 

6 适配器模式的效果

(1) 一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类适配到目标接口中
(2) 与类的适配器模式相比,要置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个 源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源类进行适配。
(3) 虽然想要置换源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增加的方法可同时适用于所有的源。
 7 适配器模式的使用场景
(1) 系统需要使用现有的类,而此类的接口不符合系统的需要。
(2) 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
(3)(对对象的适配器模式而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要对每一个子类做一个适配类,而这不太实际。
 
   
 
 
 
 
 
 
 
 
 
 
 
 
 
  
  • 大小: 7.2 KB
  • 大小: 5.8 KB
  • 大小: 7.2 KB
  • 大小: 6 KB
2
1
分享到:
评论
2 楼 砺雪凝霜 2015-05-05  
java与模式
1 楼 javaboy8282 2015-05-05  
前几天刚看过,感觉还不错,楼主看的是不是《软件秘籍--设计模式那点事》这本书?

相关推荐

    设计模式——适配器模式(adapter)

    NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1753041

    浅析Java设计模式【2】——适配器

    浅析Java设计模式【2】——适配器

    Python设计模式之适配器模式原理与用法详解

    设计模式——适配器模式 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口.Adapter Pattern使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统数据和

    设计模式——JAVA.docx

    JAVA设计模式总结之23种设计模式 一:设计模式之六大原则 总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。 1.Abstract Factory(抽象工厂模式) 2.Adapter(适配器模式)......

    Adapter(适配器模式)

    走进设计模式之——适配器模式 (Adapter) 对应代码

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

    C语言图形设计参考资料

    pathtodriver——适配器驱动程序的寻找路径,“”表示在当前目录下(*.BGI) enum graphics_driver{DETECT,CGA,MCGA,EGA,EGA64,………,VGA,PC3270}; DETECT——自动检测所用显示适配器的类型,将相应的驱动程序装入,...

    design-pattern-java.pdf

    七个结构型模式 七个结构型模式 适配器模式-Adapter Pattern 不兼容结构的协调——适配器模式(一) 不兼容结构的协调——适配器模式(二) 不兼容结构的协调——适配器模式(三) 不兼容结构的协调——适配器模式...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    深入浅出设计模式(中文版)

    4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2...

    深入浅出设计模式(中文版电子版)

    4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2...

    管理系统javasal源码-Design-Patterns-Demo:超全的设计模式——理论+实现demo

    适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)过滤器模式(Filter、Criteria Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元模式(Flyweight ...

    设计模式--可复用面向对象软件的基础

    1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...

    24种设计模式介绍与6大设计原则

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...

Global site tag (gtag.js) - Google Analytics