设计模式---结构型模式之适配器模式(Adapter Pattern)
- 适配器模式定义
将一个类的接口,转换成客户期望的另外一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式主要有两种类型:对象适配器和类适配器。
在详细解释这两种类型时,解释部分重要角色。生活中使用的笔记本电脑,都有电源适配器,这个电源适配器的作用就是将标准电压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)的更多相关文章
- Java设计模式——结构型模式
Java设计模式中共有7种结构型模式:适配器模式.装饰模式.代理模式.外观模式.桥接模式.组合模式.享元模式.其中对象的适配器模式是各种模式的起源,其关系如下面的图:1.适配器模式 适配器模式将某个类 ...
- 设计模式 结构型模式 外观模式(Facade Pattern)
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化. 这时为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“ ...
- java设计模式结构型模式
结构型模式: – 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结 构,用来解决更大的问题 分类: • 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式.享元模式 结构型模式 ...
- 设计模式-结构型模式,python组合模式
设计模式上大的方向上分继承和组合,就是类模式和对象模式.此篇的组合模式非继承和组合概念中的组合.桥接 策略 代理 装饰者都用了组合,此组合非彼组合. 组合模式 组合模式(Composite Patte ...
- 设计模式-结构型模式,python桥接模式
桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接 ...
- c#设计模式·结构型模式
看的过程中,发现好多模式都用过,只是没有总结,或者是不知道叫这个名字吧··· 这里列举结构型模式,适配器.桥接.过滤.组合.装饰器.外观.享元.代理, 适配器模式:将现存的对象放到新的环境里边去,但是 ...
- 结构型模式概述(Structural Pattern)
结构型模式可以描述两种不同的东西:类与类的实例.结构型模式可以分为类结构型模式和对象结构型模式. 类结构型模式关心类的组合,可以由多个类组合成一个更大的系统,在类结构型模式中只存在继承关系和实现关系: ...
- 七个结构模式之适配器模式(Adapter Pattern)
定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...
- Java设计模式(7)——结构型模式之适配器模式(Adapter)
一.概述 概念 其实,举个生活中的例子的话,适配器模式可以类比转接头,比如typeC和USB的转接头,把原本只能接typeC的接口,拓展为可以接普通USB:这里的转接头一方面需要查在typeC上,一方 ...
随机推荐
- CodeForces 982 D Shark
Shark 题意:一个研究员观察了一条鲨鱼n天的运动,然后这条鲨鱼他只会往前走,不会回到去过的地方,现在有一个k,,如果鲨鱼当天游过的距离 >= k, 代表的鲨鱼在这天会前往下一个地点,现在求鲨 ...
- poj 1456 Supermarket(贪心+优先队列)
题目链接:http://poj.org/problem?id=1456 题意:有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间. ...
- 2015 省赛 简单的图论问题? bfs
[E] 简单的图论问题? 时间限制: 5000 ms 内存限制: 65535 K 问题描述 给一个 n 行 m 列的迷宫,每个格子要么是障碍物要么是空地.每个空地里都有一个权值.你的 任务是从找一条( ...
- Java连载29-方法执行内存分析、方法重载
一.JVM包含三个内存区:栈内存.堆内存.方法区内存 二.注意点 (1)在MyEclipse中字体是红色的是一个类的名字,并且这个类除了我们自定义的类是JavaSE类库中自带的 (2)其实JavaSE ...
- maven仓库的配置
今天接触到了maven的配置问题,特此来记录一下,也给我这样的小白一个参考. 目标:eclipse中配置指定的maven仓库. 说明: 使用过maven项目的话,会在你的C:\Users\lenovo ...
- Java静态代码块、代码块及构造函数执行顺序
根据以下程序进行分析 定义一个父类 package sas.LearnJava; public class ExcuteOrderTest { { System.out.println("我 ...
- flume learning---Flume 集群搭建
在flume搭建集群模式时,首先需要进入conf目录, 1.cp flume-env.sh.template flume-env.sh 2.cp flume-conf.properties.templ ...
- 基于通用jar、动态配置、组件编排的会员任务中心系统设计
# 一.聊聊本文想说什么: 为更好帮助商家的会员快速成长,保持用户活性,完善用户的成长体系,有赞用户中心-会员成长团队基于现有的业务场景,设计了一套较完备任务中心系统.同时也有很多通用技术组件能够 ...
- 初识Node.js之Node与java作为后台服务器的对比
> 文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. ![file](https://img2018.cnblogs.com/blog/830272/20 ...
- 反射的应用、获取Class类实例
*准备工作: 包结构:* ======================= Person.java代码: package com.atguigu.java; public class Person { ...