适配器模式

Java开发中的23种设计模式详解

廉价感情. 提交于 2020-02-11 17:19:17
一、设计模式的分类 总体来说设计模式分为三大类: 1. 创建型模式 共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2. 结构型模式 共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 3. 行为型模式 共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 4. 其它 并发型模式和线程池模式。用一个图片来整体描述一下: 回到顶部 二、设计模式的原则(先不看) 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为

适配器模式小试

蓝咒 提交于 2020-02-10 09:12:56
一、介绍 我们看一下《研磨设计模式》中的定义: 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的本质是——转换匹配,复用功能。 怎么理解呢?就是说,新的接口需要实现的功能,旧的接口现在都有,问题是,怎么把旧的接口的实现类拿去实现新的接口。 方法很简单,那就是把旧接口的实现类放到适配器中,可以作为成员变量,也可以作为局部变量,只要能使用都可以。然后适配器实现新的接口,在适配器@Overide的方法中,调用旧接口的实现类去实现功能。 二、结构 1、Client——调用者 2、Target——目标接口,需要适配的接口 3、Adapter——适配器,实现目标接口 4、Adaptee——已经存在的接口,能满足需求,但是和目标接口不一致。适配器依赖它,来实现目标接口的功能。 三、我的实现 1、首先我们定义一个接口PastInterface,如下: package adapter; public interface PastInterface { public void past1(); public void past2(); } 2、一个简单是实现类,如下: package adapter; public class PastImpl implements PastInterface{ PastImpl(){

适配器模式

拜拜、爱过 提交于 2020-02-10 05:12:54
一、对象适配器(关联委派) 1、被适配者类Adaptee:原有的属性和方法。 2、目标接口Target:新增一些方法。 3、适配器类Adapter:持有被适配者类Adaptee的对象,即Adaptee类委派给Adapter类,因此Adaptee类和它的子类都可以适用。实现目标接口Target。持有原有的属性和方法,同时不可直接修改原有方法,还实现了目标接口中新增的方法。而且适配器类只有这些方法可以使用。替换原有类的一些方法比较麻烦,可能需要先写一个Adaptee类的子类,然后将其子类委派给Adapter类。 重定义原有方法困难,因为这是关联委派关系 。建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。 4、 二、类适配器(继承覆写) 1、被适配者类Adaptee:原有的属性和方法。 2、目标接口Target:新增一些方法。 3、适配器类Adapter:继承被适配者类Adaptee,实现目标接口Target。继承原有的属性和方法,同时也可以修改原有方法,还实现了目标接口中新增的方法。既可以使用和修改原有类的属性和方法,还可以使用目标接口中声明的方法。 一个适配器类对应一个被适配者类,因为这是继承关系 。 4、 三、接口适配器 四、优点 1、类适配器模式还具有如下优点: 由于适配器类是适配者类的子类

适配器模式/adapter模式/结构型模式

a 夏天 提交于 2020-02-10 05:12:41
定义 将类的接口转化为客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作,别名Wrapper(包装器)。 适配器模式,最终改变一个已有对象的接口。 使用场景 当有那么个类,那么个对象,却不是我想要的接口类型,肿么办?不要方,用适配器模式。 java三要素:Target(目标)+Adaptee(待适配者)+Adapter(适配器) 类的适配器,实现Target接口,继承Adaptee类,把待适配类的API转化为目标接口的API。 对象适配器,实现Target接口,持有Adaptee对象,把待适配类的API转化为目标接口的API。 缺省适配器,abstract适配器(Adapter)实现Target接口,任意实现Adapter抽象类的均是Target接口类型,而不用实现全部Target接口方法。 个人理解 好比一个多用插排,将各种插头(Adaptee)通过插排(Adapter)适配到标准插口(Target)。 代码示例 interface Target { void targetMethod1(); void targetMethod2(); } class Adaptee { public void targetMethod1() { } } //类的适配器(继承,涉及类之间的关系,所以是类的适配器) //java中没有多继承,使用单继承+实现接口

Java适配器模式

不打扰是莪最后的温柔 提交于 2020-02-10 05:09:21
  假如我的手机是typec类型的充电口,但是现在却只有个传统的MicroUSB充电线,怎么办?很简单,弄个转换接头,MicroUSB口转化成typec的,问题解决。这就是适配器的应用。   适配器就是个转化适配中间接口,可以将不匹配的两件事整合到一起,把不匹配变的匹配。   通常,适配器有三种:类适配器、对象适配器。     类适配器:继承实现,静态定义     对象适配器:代理实现,动态组合模式   一、类适配器     1.1、有个传统的Micro USB的充电线 package com.cn.adapter.classAdapter; /** * 有个传统的Micro USB的充电线 * * @author cfang * 2018年6月1日 下午4:13:01 */ public interface MicroUSB { void isMicroUSB(); }     1.2、手机充电口为typec package com.cn.adapter.classAdapter; /** * 手机充电口为typec * * @author cfang * 2018年6月1日 下午4:14:28 */ public interface TypeC { void isTypeC(); } package com.cn.adapter.classAdapter; public

设计模式之适配器模式

丶灬走出姿态 提交于 2020-02-10 04:55:23
注解:适配器模式的设计原则是“只和朋友交谈” 总结:将一个类的接口转换成客户期望的另一个接口。 适配器让原本不兼容的类可以合作无间。 当要使用一个现的类而其接口冻符合你的需要时,就使用适配器。 你可能会经常遇到下面这种情况,厂家提供的接口和你写的接口合不上,怎么办?? 这时候你不想改变自己的接口来适应厂家的接口,同时你又不能改变厂家的接口,那么这个时候你就应该考虑使用适配器模式了。 厂家调用他们的接口,而实际上我们给的却是看似像厂家的接口的接口。 通过上图我想大家应该很清楚了吧,这个模式很简单的。但是却是很有用的。 鸭子接口(厂家提供的接口) namespace 适配器模式{ /// <summary> /// 鸭子接口(厂家提供的接口) /// </summary> public interface IDuck { /// <summary> /// 嘎嘎叫 /// </summary> void Rattle(); /// <summary> /// 飞行 /// </summary> void Fly(); }} 火鸡(被适配的接口) 1 namespace 适配器模式 2 { 3 /// <summary> 4 /// 火鸡(被适配的接口) 5 /// </summary> 6 public interface ITurkey 7 { 8 /// <summary> 9 /

c++设计模式:适配器模式(Adapter Pattern)

孤街浪徒 提交于 2020-02-10 04:50:00
定义:适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。 场景:我们有一只鸭子和一只火鸡,鸭子会嘎嘎叫,而火鸡会咯咯叫,鸭子飞的要远一点,而火鸡只能飞行一小段距离。火鸡和鸭子都会叫,但是他们的叫声不同,接口也不同,飞行的接口相同但是飞行的行为不同。 对象适配器:使用对象的组合,以修改的接口包装被适配者。该种做法的优点是被适配者的任何子类都可以搭配着适配器使用。我们分别实现鸭子和火鸡的适配器,鸭子适配器关联了一个鸭子对象,继承自火鸡对象,这样我们可以覆盖火鸡的接口以适应鸭子的行为。同样,火鸡适配器关联了一个火鸡对象,继承自鸭子对象,这样我们就可以覆盖鸭子的接口以适应火鸡的行为。这样我们使用鸭子适配器就可以把我们的鸭子包装称一个火鸡,虽然这个火鸡的叫声和飞行距离跟实际的火鸡不同。 类图: c++代码如下: #include <iostream>using namespace std;class Duck{public: virtual void quack() = 0; virtual void fly() = 0;};class MallardDuck : public Duck{public: void quack(); void fly();};class Turkey{public: virtual void gobble() = 0

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

巧了我就是萌 提交于 2020-02-10 04:47:31
定义: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 书中说到Gof的设计模式中,讲了两种类型的适配器模式: 1.类适配器模式 2.对象适配器模式 其中,类适配器模式,是通过多重继承来实现了。 但是Java是不支持多重继承的,所以下面主要讲的是对象适配器模式。 结构:(书中图,侵删) 一个客户真正要使用的目标接口(具体一点说可以叫方法),包含它的可以是接口、抽象类、类 一个需要被适配的接口(方法),同上 一个适配器,继承自目标接口,包含一个需要被适配的接口 实例: 书中提到一个电源适配器的例子,很形象,所以这里提一嘴。 就是中国的电源是220V,但有的国家是110V,出国之后依旧想使用中国的电器怎么办?就需要用到适配器来转换一下电压。 说到这里,我就想到了一个例子,护照。 中国公民有中国的身份证,外国人也有外国的id card,我们不能指望外国人都用中国的身份证,同样我们也不可能都使用外国的id card。 但是出入境怎么验证你的身份呢,这就需要用到护照,护照就相当于全球通用的身份证。我们这里忽略签证的存在,签证也要盖在护照上不是。 目标类(外国身份认证): package designpattern.adapter; import java.util.HashSet; import java.util

设计模式学习笔记十一:适配器模式(Adapter Pattern)

社会主义新天地 提交于 2020-02-10 04:46:43
1.概述 在软件开发中,我们经常会遇到系统间集成,在系统集成时,最常见的问题就是系统间的接口不一致。很多能够满足功能的系统模块,由于接口不一致,导致无法使用。例如,常用的媒体播放器是MS Media player和RealPlayer,他们的文件结构和软件接口完全不同,前者支持WMF格式的音频和视频,后者支持RM格式的音频和视频。如果我们希望自己的软件能够播放这两种播放器播放相应格式的音频和视频,我们该怎么办呢?一切从头开始,重写一个支持这两种格式的播放软件?呵呵,你要不觉得累你就重写了,呵呵。 适配器模式(Adapter): 将一个的接口转化成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的的那些类可以一起工作。 适配器模式的意图就是使接口不兼容的类能够一起工作,通常情况下,这些接口不兼容的类在逻辑上的功能是一致或相似的。在开发中,系统的数据和行为都正确,但接口不符时,我们就应该考虑用适配器模式,目的就在于使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要用于希望服用一些现有的类,但是接口又与环境要求不一致的情况。 适配器有类适配器和对象适配器两种类型,二者的意图相同,只是实现的方法和适用的情况不同。类适配器采用继承来实现,对象适配器则采用组合的方法来实现。 类适配器:类适配器通过多重继承对一个接口与另一个接口进行匹配,其结构如下图所示:

设计模式之适配器模式(Adapter Pattern)C++实现

China☆狼群 提交于 2020-02-10 04:45:48
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这样的类型的设计模式属于结构型模式。它结合了两个独立接口的功能。 意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本因为接口不兼容而不能一起工作的那些类能够一起工作。 主要解决:主要解决在软件系统中。经常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。 何时使用: 1、系统须要使用现有的类,而此类的接口不符合系统的须要。 2、想要建立一个能够反复使用的类,用于与一些彼此之间没有太大关联的一些类,包含一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换。将一个类插入还有一个类系中。(比方老虎和飞禽,如今多了一个飞虎。在不添加实体的需求下,添加一个适配器,在里面包容一个虎对象,实现飞的接口。 ) 怎样解决:继承或依赖(推荐)。 长处: 1、能够让不论什么两个没有关联的类一起执行。 2、提高了类的复用。 3、添加了类的透明度。 4、灵活性好。 缺点: 1、过多地使用适配器,会让系统非常零乱,不易总体进行把握。比方,明明看到调用的是 A 接口,事实上内部被适配成了 B 接口的实现,一个系统假设太多出现这样的情况,无异于一场灾难。因此假设不是非常有必要,能够不使用适配器。而是直接对系统进行重构。 2.因为 JAVA 至多继承一个类