设计模式_4_适配器模式(AdapterPattern, 多个功能的结合)

适配器模式(AdapterPattern, 结构型模式)

用最通俗的讲法就是: 将多个功能相关或不相关的接口( 你需要的接口 )放到同一个实现类里, 构造一个具有多工功能, 多特点的"异类对象"

  • 定义
    是作为多个接口之间的桥梁,结合多个独立的接口(将多个类/功能结合在一起,构建出一个可以产生需要的对象的适配器)

  • 角色关系
    多个独立的接口及其实现类, 适配器(实现这多个目标接口)

  • 优点
    可以让多个个没有关系的接口/类一起运行, 提高类的复用性, 增加类的灵活性

  • 缺点
    过多使用适配器造成系统凌乱, 例如:表面上使用A接口,适配器却将A改为B接口,造成接口使用的混乱, 因此如果不是有必要的, 可以不使用适配器, 而是直接对系统重构
    由于java单继承, 当适配类的时候, 只能适配一个类(为抽象类);

注: 适配器主要是用与解决正在服役的项目的问题, 不是在类详细设计的时候添加 (使用适配器, 构造出一个我们想要的对象, 解决燃眉之急)

  • 实现方式
    一般通过适配器继承或者以来已有对象, 实现想要的目标接口

代码演示:

例1

将播放MP4与VCL的播放器进行适配, 构建一个既能播放MP4, 又能放VCL的播放器

package com.AdapterPattern;
/*** 1、系统需要使用现有的类,而此类的接口不符合系统的需要。*  2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。*   3、通过接口转换,将一个类插入另一个类系中。* @author regotto**/
public class AdapterPatternDemo1 {public static void main(String[] args) {AudioPlayer ap=new AudioPlayer();ap.play("mp3", "1号文件");ap.play("vcl", "2号文件");ap.play("mp4", "3号文件");}
}//最高级的播放器
interface MediaPlayer{public void play(String audioType,String fileName);
}//实现MediaPlayer, 可播放mp3, 调用视屏播放的适配器,达到播放mp4, vcl的目的
class AudioPlayer implements MediaPlayer{MediaAdapter ma=null;@Overridepublic void play(String audioType, String fileName) {if(audioType.equals("mp3"))	System.out.println("Playing:"+fileName);else if(audioType.equals("vcl") || audioType.equals("mp4")) {ma=new MediaAdapter(audioType);ma.play(audioType, fileName);}else System.out.println("文件格式未识别");}
}//播放器适配器(抽取出相同的特性进行适配), 将vcl mp4的播放进行适配, 得到一个既能放VCL又能放MP4的一个播放器
class MediaAdapter implements MediaPlayer{AdvanceMediaPlayer amp=null;public MediaAdapter(String audioType) {if(audioType.equals("vcl")) {amp=new VlcPlayer();}else if(audioType.equals("mp4")) {amp=new Mp4Player();}}@Overridepublic void play(String audioType, String fileName) {if(audioType.equals("vcl"))amp.playVlc(fileName);else if(audioType.equals("mp4"))amp.playMp4(fileName);}}//播放VCL, MP4, VCL/MP4通过相同的接口实现,具有一定的共同特征
interface AdvanceMediaPlayer{void playVlc(String fileName);void playMp4(String fileName);
}
class VlcPlayer implements AdvanceMediaPlayer{@Overridepublic void playVlc(String fileName) {System.out.println("Playing: "+ fileName);}@Overridepublic void playMp4(String fileName) {}
}
class Mp4Player implements AdvanceMediaPlayer{@Overridepublic void playMp4(String fileName) {System.out.println("Playing: "+ fileName);}@Overridepublic void playVlc(String fileName) {}
}

例2

使用老虎对象, 与fly接口, 通过适配器构造一个"飞虎对象"

package com.AdapterPattern;public class AdapterPatternDemo2 {public static void main(String[] args) {new AnimalAdapter(new Tiger("Atiger", "东北虎")).fly();}}//飞虎
class AnimalAdapter implements Flying{private Animal animal;public AnimalAdapter(Animal animal) {this.animal = animal;}@Overridepublic void fly() {animal.behavior();System.out.println("I can fly");}
}abstract class Animal{protected String name;protected String animalType;abstract public void behavior();public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAnimalType() {return animalType;}public void setAnimalType(String animalType) {this.animalType = animalType;}}
//老虎
class Tiger extends Animal{public Tiger() {}public Tiger(String name, String animalType) {this.name = name;this.animalType = animalType;}@Overridepublic void behavior() {System.out.println(name+"--"+animalType+"--森林之王");}
}
interface Flying{void fly();
}
//鸟
class Bird extends Animal implements Flying{@Overridepublic void behavior() {System.out.println(name+"--"+animalType);fly();}@Overridepublic void fly() {System.out.println("I can fly");}
}

结语:

适配器就是将多个功能结合在一起, 达到一个新的功能, 与建造者模式不同的是, 适配器实现的接口可以有关系, 也可以没有关系, 建造者模式依赖的是不变的关系, 变的只是内部的零件

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xgboost分类_XGBoost(Extreme Gradient Boosting)

一、XGBoost在Ensemble Learning中的位置机器学习中,有一类算法叫集成学习(Ensemble Learning),所谓集成学习,指将多个分类器的预测结果集成起来,作为最终预测结果,它要求每个分类器具备一定的“…

Android技术架构演进与未来

本文阅读大约需15分钟 引言众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,每年迭代一次大版本升级。 小米、华为、OPPO、VIVO、三星等各大厂商对Android原生系统进行二次开发衍生出具有各家特色的系统(比如MIUI)&…

Sublime Text 3插件安装方法

一:安装Sublime Text 3插件的方法安装package control组件,然后直接在线安装:1、按Ctrl调出console(注:安装有QQ输入法的这个快捷键会有冲突的。输入法属性设置-输入法管理-取消热键切换至QQ拼音) 2、粘贴下…

Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则

Hibernate( ORM框架 ) Hibernate是一个数据持久化层的ORM框架. 它通过JavaBean, 数据库中的表与自身的映射关系达到表中数据的增删改查 特性 1.对JDBC访问数据库的代码进行封装, 简化数据访问的重复性代码 2.使用反射机制完成对Bean的封装 3.轻量级框架,支持关系型数据库 核…

建筑电气工程设计常用图形和文字符号_建筑水电图纸看不懂?10年老师傅教你看图技巧,分分钟安排...

1、建筑给排水工程包括:给水、排水、热水、消火栓、自动喷淋等常用系统,其管道当中流动的是水。(其管道输送介质为水)2、给排水系统的主要功能:(1)建筑给水系统的任务,就是经济合理地将水由室外给水管网输送到装置在室内的各种配水…

Android系统架构开篇

Android系统庞大且错综复杂,Gityuan带领大家初探Android系统整体架构,一窥其全貌。一、引言本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Andro…

20155220 实验三 敏捷开发与XP实践 实验报告

20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础XP核心实践相关工具实验要求 没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意…

Hibernate_2_Hibernate中对象状态及转化_一级缓存_Session详解_HQL/SQL/Criteria_一对多关系_级联操作

Hibernate中的对象状态 在Hibernate中持久化对象具有三种状态: 瞬时态, 持久态, 游离态. 瞬时态: 对象没有与Hibernate产生关联(transient,session中没有缓存), 数据库中也没有对应记录> 对象无id, 没有关联 持久态: 对象与Hibernate产生关联(persistent, session中有缓存…

python正则表达式操作指南_第二篇详细Python正则表达式操作指南(re使用)

接下来昨天的内容执行匹配一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?RegexObject 实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Python Library Reference如果没有匹配到的话,match…

Android binder 框架和学习资料

1Android binder 是学习 Android 系统一定要啃得硬骨头,可能你刚开始的时候并不理解其中的精髓,但是在 android 系统的很多地方你都会遇到它。不过要我自己写明白其中的逻辑脉络需要花费太多的时间和精力,而且传播效果也不是非常好…

Spring_Bean配置_生命周期_注解

Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之…

完全理解Gson(1):简单入门

GSON是Google开发的Java API,用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问:http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础,因此不需要任何GSON…

python自由落体_VPython - example - 模拟自由落体运动

作者:liuyuan_jq2011-04-10from visual import *scene.width 400scene.height 300scene.autoscale 0scene.range (100,100,100)scene.center (0,40,0)ball sphere(pos(0,100,0),radius2)ground box(pos(0,-1,0),size(10,2,10))gravity 9.8 # m/s**2seconds …

创业碎碎念

1今天,跟几条跟我玩的比较好的篮球狗在讨论人生,其中有一条特别感慨,「为何看上去别人做起来这么容易的事,我们做很难?」。我突然不知道如何去回答这样的问题?这个问题也一直困扰着我。读我文章…

压缩过的js代码怎么还原_Fundebug 前端 JS插件更新至 1.7.0,拆分录屏代码,还原部分 Script error....

摘要: BUG 监控插件压缩至 18K。1.7.0拆分了录屏代码,BUG 监控插件压缩至18K,另外我们还原了部分 Script error,帮助用户更方便地 Debug。请大家及时更新哈~拆分录屏代码从1.7.0版本开始,我们拆分了录屏代码。如果需要…

SpringAOP描述及实现_AspectJ详解_基于注解的AOP实现_SpringJdbcTemplate详解

AOP AOP特点: 面向切面编程, 利用AOP对业务逻辑的各个部分进行抽取公共代码, 降低耦合度, 提高代码重用性, 同时提高开发效率.采取横向抽取, 取代传统纵向继承体系重复性代码解决事务管理, 性能监视, 安全检查, 缓存, 日志等问题Spring AOP在运行期, 通过反向代理的方式解决类…

(十九)java多线程之ForkJoinPool

本人邮箱: kco1989qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco1989/kco 代码已经全部托管github有需要的同学自行下载 引言 java 7提供了另外一个很有用的线程池框架,Fork/Join框架 理论 Fork/Join框架主要有以下两个类组…

串口,com口,ttl,max232你应该知道的事

1今天,说几个比较基础的知识,大家在开发过程中经常会遇到但是又不是特别注意的知识点。TTL电平:TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通…

视觉slam十四讲 pdf_视觉SLAM十四讲|第12讲 回环检测

1. 什么是回环检测前面有说过累积误差的问题,前一时刻的误差会积累到后面,导致画不成圈圈,如图12-1所示,而画圈圈(全局一致性)很重要,所以需要有一个步骤来纠正当前的计算偏差。回环检测通过判断…

Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]

这篇文章主要介绍Caffe2的基本数据结构: WorkspacesOperatorsNets在开始之前最好先阅读以下Intro Turorial首先,导入caffe2。其中core和worksapce模块,这是必须的两个模块。如果你要使用Caffe2生成的protocol buffers,那么你也需要…