• 适配器模式定义

    将一个类的接口,转换成客户期望的另外一个接口。适配器让原本接口不兼容的类可以合作无间。

    适配器模式主要有两种类型:对象适配器和类适配器。

    在详细解释这两种类型时,解释部分重要角色。生活中使用的笔记本电脑,都有电源适配器,这个电源适配器的作用就是将标准电压220V交流电转变为低压直流电,供电脑充电的一种装置。这个装置便是适配器模式中的适配器角色,而标准电压220V交流电便是电源(我们也可以简称为适配者对象),笔记本通过电源适配器,可以获取到适合自己使用的低压直流电,而不需要更改厂商的API,这就是适配器作用最大的地方。

  • 对象适配器 

    该种类型主要使用组合方式实现,适配器对象内部使用组合方式调用被适配者对象。 

package adapterpattern;
/**
* 220V电压提供者
* @author Administrator
*/
public class Adaptee {
/**
* 提供220V标准电压
* @return
*/
public int provideStandardVol(){
return 220;
}
}
package adapterpattern;

/**
* 电源适配器目标接口,可以适配多种不同标准的笔记本
* @author Administrator
*
*/
public interface Target {
public int getFitnessVol();
}
package adapterpattern;

/**
* 电源适配器的实现
* @author Administrator
*/
public class ObjcetTypeAdaptor implements Target{
Adaptee adaptee;
public ObjcetTypeAdaptor(Adaptee adaptee){
this.adaptee = adaptee;
}
/**
* 获取笔记本所需要的标准电压
* @return
*/
public int getFitnessVol(){
int tmpVol = adaptee.provideStandardVol();
System.out.println("获取标准电压:[" + tmpVol + "V]");
System.out.println("Adaptor准备转换成适配电压");
//此处为简单示例 TODO
tmpVol = 19;
System.out.println("Adaptor转换成适配电压[" + tmpVol + "V]");
return tmpVol; }
}
  • 类适配器

    该种类型主要使用继承方式实现。适配器对象通过继承来调用被适配器对象方法。

package adapterpattern;

public class ClassTypeAdaptor extends Adaptee implements Target{

    /**
* 获取笔记本所需要的标准电压
* @return
*/
public int getFitnessVol() {
int tmpVol = provideStandardVol();
System.out.println("获取标准电压:[" + tmpVol + "V]");
System.out.println("Adaptor准备转换成适配电压");
//此处为简单示例 TODO
tmpVol = 19;
System.out.println("Adaptor转换成适配电压[" + tmpVol + "V]");
return tmpVol;
}
}
package adapterpattern;

/**
* 笔记本对象
* @author Administrator
*
*/
public class Computer {
private Target target; public Computer(Target target){
this.target = target;
} public void working(){
if(null != target && 0 != target.getFitnessVol()){
System.out.println("已插电源适配器,准备工作ing。。。");
}else{
System.out.println("未插电源适配器或电源适配器损坏,无法工作");
}
}
/**
* @param args
*/
public static void main(String[] args) {
//初始化一台标准220V电压
Adaptee adaptee = new Adaptee();
System.out.println("--------------对象适配器分割线开始-------------");
//声明一个电源适配器
Target adaptor1 = new ObjcetTypeAdaptor(adaptee);
//开始构造一台电脑
Computer computer1 = new Computer(adaptor1);
computer1.working();
System.out.println("笔记本1构造完毕,可以启动。。。。");
System.out.println("--------------对象适配器分割线结束-------------");
System.out.println("--------------类适配器分割线开始--------------"); Target adaptor2 = new ClassTypeAdaptor();
Computer computer2 = new Computer(adaptor2);
computer2.working();
System.out.println("笔记本2构造完毕,可以启动。。。。");
System.out.println("--------------类适配器分割线结束--------------");
}
} /**
* 输出:
* --------------对象适配器分割线开始-------------
* 获取标准电压:[220V]
* Adaptor准备转换成适配电压
* Adaptor转换成适配电压[19V]
* 已插电源适配器,准备工作ing。。。
* 笔记本1构造完毕,可以启动。。。。
* --------------对象适配器分割线结束-------------
* --------------类适配器分割线开始--------------
* 获取标准电压:[220V]
* Adaptor准备转换成适配电压
* Adaptor转换成适配电压[19V]
* 已插电源适配器,准备工作ing。。。
* 笔记本2构造完毕,可以启动。。。。
* --------------类适配器分割线结束--------------
*/
  • 两种类型适配器的比较

   通过以上两个例子:将适合笔记本低压直流电目标类和标准高压交流电的适配者类解耦,通过引入适配器类来改造适配者类,而无需修改适配者类代码。

   类适配器模式中类是适配者类的子类,适配器类可以通过重写来构造新的方法,灵活性更强,但是也具有一定局限性:对于不支持多重继承的语言,只能单继承。

   对象适配器模式中适配器类通过组合方式来调用适配者类,可以适配多个适配者类。该类型与类适配器模式相比,不能改变适配者的方法。

设计模式---结构型模式之适配器模式(Adapter Pattern)的更多相关文章

  1. Java设计模式——结构型模式

    Java设计模式中共有7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,其关系如下面的图:1.适配器模式 适配器模式将某个类 ...

  2. 设计模式 结构型模式 外观模式(Facade Pattern)

    在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...

  3. java设计模式结构型模式

    结构型模式: – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结 构,用来解决更大的问题 分类: • 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式.享元模式 结构型模式 ...

  4. 设计模式-结构型模式,python组合模式

    设计模式上大的方向上分继承和组合,就是类模式和对象模式.此篇的组合模式非继承和组合概念中的组合.桥接 策略 代理 装饰者都用了组合,此组合非彼组合. 组合模式 组合模式(Composite Patte ...

  5. 设计模式-结构型模式,python桥接模式

    桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接 ...

  6. c#设计模式·结构型模式

    看的过程中,发现好多模式都用过,只是没有总结,或者是不知道叫这个名字吧··· 这里列举结构型模式,适配器.桥接.过滤.组合.装饰器.外观.享元.代理, 适配器模式:将现存的对象放到新的环境里边去,但是 ...

  7. 结构型模式概述(Structural Pattern)

    结构型模式可以描述两种不同的东西:类与类的实例.结构型模式可以分为类结构型模式和对象结构型模式. 类结构型模式关心类的组合,可以由多个类组合成一个更大的系统,在类结构型模式中只存在继承关系和实现关系: ...

  8. 七个结构模式之适配器模式(Adapter Pattern)

    定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...

  9. Java设计模式(7)——结构型模式之适配器模式(Adapter)

    一.概述 概念 其实,举个生活中的例子的话,适配器模式可以类比转接头,比如typeC和USB的转接头,把原本只能接typeC的接口,拓展为可以接普通USB:这里的转接头一方面需要查在typeC上,一方 ...

随机推荐

  1. Codeforces Round #480 (Div. 2) A. Links and Pearls

    题目地址:http://codeforces.com/contest/980/problem/A 官方题解: 我的理解:o表示珍珠,-表示链子,给一串字符串你可以任意重组这条项链(不能删去),判断这条 ...

  2. CodeForces 103 D Time to Raid Cowavans

    Time to Raid Cowavans 题意:一共有n头牛, 每头牛有一个重量,m次询问, 每次询问有a,b 求出 a,a+b,a+2b的牛的重量和. 题解:对于m次询问,b>sqrt(n) ...

  3. NOIP 2005 等价表达式 题解

    题意 给一个表达式然后再给n个表达式,判断是否等价 一道大模拟题,将a带为数,并且取模防止溢出 #include<bits/stdc++.h> using namespace std; c ...

  4. HDU 1015 Safecracker (DFS)

    题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...

  5. 阿里社招Java面试题总结——面试官分享

    面试题 1.Java中的内存溢出是如何造成的 2.gc的概念,如果A和B对象循环引用,是否可以被GC? 3.Error.Exception和RuntimeException的区别,作用又是什么? 4. ...

  6. .Net基础篇_学习笔记_第五天_流程控制do-while循环

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. charles 编辑菜单总结

    本文参考:charles 编辑菜单总结 charles中proxy菜单的介绍:我的是4.1.2版本,mac系统下的菜单大同小异: 如下图: 这里其实都是常用的功能: 大概可以分为5个大块,看下分割线就 ...

  8. 如何更规范化使用MySQL

    如何更规范化使用MySQL 背景:一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢:而在Java应用开发中数据库更是尤为重要,绝大多数情况下数据库的性能决定了程序的性能,如若前期埋下的 ...

  9. 让我们一起学习如何使用AIDL,它其实并不难(Android)

    前言 该篇文件讲述的是AIDL最基本的使用(创建.调用),关于对于AIDL更深的认识,在后续的随笔中,会持续与大家分享并探讨. 正文 AIDL的定义(什么是AIDL?) AIDL的应用场景(AIDL可 ...

  10. java取json 的方法

    public static void main(String[] args) { String jsonStr = "[{\"varieties_type\":\&quo ...