适配器(Adaptor)模式PPT教学课件
充器及适配器介 adapter
输入电压误差: ±T % 额定值
不同输出电压的效率比较。
Vo 5 15 30 Io,A 10 10 10 Vdc(min) Vdc(max),V ,V 7.5 9.75 17.5 22.8 32.5 42.25 Headroom, Pin(max) Po(max), Dissipation, Efficiency max,V ,W W Q1max 4.75 97.5 50 47.5 51.28 7.75 228 150 78 65.79 12.25 423 300 123 70.92
Slide# 36
变压器尺寸由开关频率决定
• 变压器中原边电流变化频率意味着每秒传递能量的次数,而磁心的尺寸由每 次所需传递的能量决定。
– 对于50Hz,50次能量传递每秒,变压器每次需传递较多的能量。 – 而对于高频率,有几千次(或更多)能量传递每秒,变压器每次需传递的能量就少得 多了。
Slide# 37
Environmental Specifications
Operating temperature: Storage temperature: Electromagnetic susceptibility: Humidity: Vibration: 0° to 50°C ambient -40°C to +85°C Designed to meet EN55082-1 Operating; non-condensing 20% to 90% RH Per IEC 60068-2-6
Slide# 34
变压器 (IV)
•
若是耦合线圈,则原边产生的磁力线也会与副边耦合
Slide# 35
变压器 (V)
Pp=Vp*Ip
Np
L11A适配器模式
sampleOperation1() sampleOperation2()
Adaptee
sampleOperation1()
Adapter
sampleOperation2()
模式所涉及的角色有: 模式所涉及的角色有: 目标(Target)角色:这就是所期待得到的接口。 角色: 目标 角色 这就是所期待得到的接口。 角色: 源(Adaptee)角色:现有需要适配的接口。 角色 现有需要适配的接口。 适配器(Adapter)角色:适配器类是本模式的核心。适配器把源接口 角色: 适配器 角色 适配器类是本模式的核心。 转换成目标接口。显然,这一角色必须是具体类。 转换成目标接口。显然,这一角色必须是具体类。 本模式的示意性源代码如下所示: 本模式的示意性源代码如下所示:
在什么情况下使用适配器模式
(1)系统需要使用现有的类,而此类的接口不符合系统的 系统需要使用现有的类, 系统需要使用现有的类 需要。 需要。 (2)想要建立一个可以重复使用的类.用于一些彼此之间 想要建立一个可以重复使用的类. 想要建立一个可以重复使用的类 没有太大关联的一些类, 没有太大关联的一些类,包括一些可能在将来引进的类 一起工作,这些源类不一定有很复杂的接口。 一起工作,这些源类不一定有很复杂的接口。 (3)(对对象的适配器模式而言 在设计里,需要改变多个 对对象的适配器模式而言)在设计里 对对象的适配器模式而言 在设计里, 已存在的子类的接口.如果使用类的适配器模式、 已存在的子类的接口.如果使用类的适配器模式、就要 针对每一个子类做一个适配器类,而这不太实际。 针对每一个子类做一个适配器类,而这不太实际。
package com.javapatterns.adapter.classAdapter; public interface Target { void sampleOperation1(); //源类有的方法 源类有的方法 void sampleOperation2(); //源类没有的方法 源类没有的方法 }
设计模式——08适配器模式与桥接模式
原则(即一个类只有一个变化的原因),复用性比较差。桥接模式是比多继承 方案更好的解决方法。
桥接模式(续)
模式优缺点 桥接模式有以下优点:
桥接模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的
维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交 错的结果,并不一定要使用桥接模式。桥接模式提高了系统的可扩充性。
多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换 掉,然后再把适配者类的子类当做真正的适配者进行适配。
虽然要想置换适配者类的方法并不容易,但是要想增加一些新的方法
则很方便。
适配器模式(续)
模式使用 在以下情况下可以使用适配器模式:
系统需要使用现有的类,而此类的接口不符合系统的需要。
桥接模式(续)
实例分析 实例一:毛笔和蜡笔(代码实现)
桥接模式(续)
实例分析 实例二:跨平台图片查看器的制作
Linux
+ display (String str) : void
Unix
+ display (String str) : void
Windows
+ display (String str) : void
模式结构
Client
Abstraction
imp + operation () imp.operationImp();
Implementor
+ operationImp ()
RefinedAbstraction
ConcreteImplementorA
+ operationImp ()
ConcreteImplementorB
ADAPTER设计
ADAPTER设计适配器(Adapter)是一种设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。
适配器模式使得原本由于接口不兼容而不能一起工作的类能够协同工作。
适配器通常包含两个部分:适配器类和被适配的类。
适配器类实现了客户端期望的接口,并将其方法转发给被适配类来处理。
被适配的类是原本存在的类,它拥有客户端不兼容的接口。
使用适配器的主要目的是解决接口不兼容的问题。
当我们需要使用一个已经存在的类,但是它的接口与我们所期望的接口不一致时,可以使用适配器模式。
适配器模式可以让我们重用已有的类,同时又不需要修改其原有代码。
这种模式在将不同的第三方库或组件整合到一个系统时特别有用。
适配器模式的应用场景很广泛。
例如,我们可以使用适配器将一个已有的类库适配成符合特定接口的类,以便于在我们的代码中使用。
适配器模式还可以用于将一个新的类库适配成已有的类的接口,以减少代码修改的工作量。
此外,适配器模式还可以用于系统的解耦,将不同的模块之间的接口适配成统一的接口,从而提高系统的灵活性和可维护性。
下面我们来用一个具体的例子来说明适配器设计模式的实际应用。
假设我们正在开发一个音频播放程序,它可以播放不同格式的音频文件,包括MP3、WAV和OGG。
为了实现这个功能,我们引入了一个已有的MP3播放库和一个已有的OGG播放库,但是它们的接口不兼容,我们需要将它们适配成统一的接口。
首先,我们定义一个统一的音频播放接口,包含两个方法:playMP3(和playOGG(。
然后,我们创建一个适配器类AudioPlayerAdapter,实现音频播放接口,并将其方法转发给MP3播放库和OGG播放库来处理。
最后,我们在我们的音频播放程序中使用适配器类来播放各种格式的音频文件。
适配器模式的优点是可以让我们重用已有的类,同时又不需要修改其原有代码。
这种重用的方式是通过适配器的转发机制实现的,因此适配器模式具有很好的灵活性。
另外,适配器模式还可以降低系统的耦合度,通过统一的接口来调用不同的类库或组件,从而提高系统的扩展性和维护性。
适配器(Adapter)模式
适配器(Adapter)模式一、适配器(Adapter)模式适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。
名称由来这很像变压器(Adapter),变压器把一种电压变换成另一种电压。
美国的生活用电电压是110V,而中国的电压是220V。
如果要在中国使用美国电器,就必须有一个能把220V电压转换成110V电压的变压器。
这个变压器就是一个Adapter。
Adapter模式也很像货物的包装过程:被包装的货物的真实样子被包装所掩盖和改变,因此有人把这种模式叫做包装(Wrapper)模式。
事实上,大家经常写很多这样的Wrapper 类,把已有的一些类包装起来,使之有能满足需要的接口。
适配器模式的两种形式适配器模式有类的适配器模式和对象的适配器模式两种。
我们将分别讨论这两种Adapter 模式。
二、类的Adapter模式的结构:由图中可以看出,Adaptee类没有Request方法,而客户期待这个方法。
为了使客户能够使用Adaptee类,提供一个中间环节,即类Adapter类,Adapter类实现了Target接口,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest 方法,实现了适配的目的。
因为Adapter与Adaptee是继承的关系,所以这决定了这个适配器模式是类的。
该适配器模式所涉及的角色包括:目标(Target)角色:这是客户所期待的接口。
因为C#不支持多继承,所以Target必须是接口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。
这一角色必须是类。
三、类的Adapter模式示意性实现:下面的程序给出了一个类的Adapter模式的示意性的实现:// Class Adapter pattern -- Structural exampleusing System;// "ITarget"interface ITarget{// Methodsvoid Request();}// "Adaptee"class Adaptee{// Methodspublic void SpecificRequest(){Console.WriteLine("Called SpecificRequest()" );}}// "Adapter"class Adapter : Adaptee, ITarget{// Implements ITarget interfacepublic void Request(){// Possibly do some data manipulation// and then call SpecificRequestthis.SpecificRequest();}}///<summary>/// Client test///</summary>public class Client{public static void Main(string[] args){// Create adapter and place a requestITarget t = new Adapter();t.Request();}}四、对象的Adapter模式的结构:从图中可以看出:客户端需要调用Request方法,而Adaptee没有该方法,为了使客户端能够使用Adaptee类,需要提供一个包装(Wrapper)类Adapter。
适配器模式Adapter
ILogAdaptee +WriteLog()
DataBaseLog
FileLog
新的日志记录工具类结构图
新的日志记录类主要实现代码
public abstract class LogAdaptee { public abstract void WriteLog();} public class DatabaseLog : LogAdaptee { public override void WriteLog() {Console.WriteLine("Called WriteLog Method"); }
复用、类库迁移等方面非常有用!
2.GoF23定义两种Adapter模式的实现结构:对象适配器
参见课本图12-6 类适配器模式, 和类适配器。但类适配器采用“多继承”实现方式,带
来不良的高耦合,不推荐使用。对象适配器采用“对象
组合”方式,更符合松耦合精神。
并写出其实现代码
3.Adapter模式本身要求尽可能地使用“面向接口的编程 ”风格,这样才能在后期很方便地适配!
客户期待的借口,可以是具体类或
Client Target +Request()
抽象类、接口!
Adapee +SpecificRequest()
需要适配的类 在其内部包含一个Adaptee对象,
把源接口转换成目标接口
参见课本图12-5
模式角色
•目标(Target)角色:所期待的接口,可以是接口 的或抽象类. •源(Adaptee)角色:现有的需要适配的接口. •适配器(Adapter)角色:本模式的核心,把源接口 转换成目标接口,这一角色必须是具体类!
•当软件开发进行到一半时,处于某种原因不能继续使用
Adapter(适配器)
电压转换插座
定义两个电器类的interface: ChineseAppliance和USAppliance。
public interface ChineseAppliance { void powerOn(ChinesePlug cp);
} public interface USAppliance {
有一个已经存在并使用了的接口,只个接口是需要 我们适配的
Client: 客户调用类
协同对象符合Adapter适配器(公接口)
定义
定义
类型
类的Adapter模式(继承) 对象的Adapter模式(委托)
电压转换插座
美国电器的额定电压是120V,中国电器 的额定电压是220V
public void chargeIn120V(){ System.out.println("charge in volt 120"); }
}
电压转换插座
创建Adapter来实现转换。 ChinaToUSAdapter类实现把中国电压转
换成美国电压, USToChinaAdapter类实现把美国电压转
} public interface USPlug {
public void chargeIn120V(); }
电压转换插座
ChineseAppliance接口,写一个类 ChineseTV来实现。
USAppliance接口,写一个USFridge类来 实现。
ChinesePlug接口,写一个 ChinesePlugInstance类实现。
void powerOn(USPlug up); }
电压转换插座
4、适配器模式
适配器模式:Adapter1、基本原理适配器模式将一个接口转换成客户希望的另外一个接口。
它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。
——Gang of Four有两种类型的适配器模式:–类适配器(采取继承的方式)–对象适配器(采取对象组合方式)(推荐):实现思路:继承新系统,关联旧系统该模式中包含的角色及其职责1 目标接口(Target):客户所期待的接口。
目标可以是具体的或抽象的类,也可以是接口。
2 源类(Adaptee 适配者类):已经存在的接口,通常能满足客户端的功能需求,但是接口和客户端要求的特定领域接口不一致,需要被适配。
3 适配器(Adapter):把Adaptee适配称为Client需要的Target。
2、优缺点充分利用已经存在的资源,实现软件的复用,节省开发成本和时间。
对于类适配器:1. 使得Adapter可以override(重写) Adaptee的部分行为,因为Adapter是Adaptee的一个子类。
2. 用一个具体的Adapter类对Adaptee和Taget进行匹配。
结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
对于对象适配器:1. 允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。
Adapter也可以一次给所有的Adaptee添加功能。
2. 使得override(重写)Adaptee的行为比较困难。
如果一定要override Adaptee的方法,就只好先做一个Adaptee的子类以override Adaptee的方法,然后再把这个子类当作真正的Adaptee源进行适配。
3、适用情况1.正在开发的系统想使用一个已经存在的类,并且该类很重要,但是该类提供的接口和系统不一致。
2.对旧系统的复用。
3.使用了第三方软件,并且第三方提供的软件的接口和系统不一致。
4.两个已经存在的类完成的功能一致,但是接口不一样。
设计模式之适配器模式
设计模式之适配器模式模式动机
适配器模式的作用就是解决两个软件实体间接口不兼容状况.
通常状况下,用法者可以通过目标类的接口拜访它所提供的服务。
开头时候没有什么问题, 但是一但后续别的接口(如第三方接口)有变动或者后续扩展需求, 此时用法原有接口已经不行以提供服务, 那么我们就需要把现有接口转化为用法者需要的接口.适配器模式就是用来完成这样的转化.
在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。
模式定义
适配器模式(Adapter Pattern) :将一个接口转换成用法者希翼的
第1页共17页。
数据适配器Adapter讲解35页PPT
1、最灵繁的人也看不见自己的背脊。——非洲 2、最困难的事情就是认识自己。——希腊 3、有勇气承担命运这才是英雄好汉。——黑塞 4、与肝胆人共事,无字句处读书。——周恩来 5、阅读使人充实,会谈使人敏捷,写作使人精确。——培根
பைடு நூலகம்
数据适配器Adapter讲解
11、用道德的示范来造就一个人,显然比用法律来约束他更有价值。—— 希腊
12、法律是无私的,对谁都一视同仁。在每件事上,她都不徇私情。—— 托马斯
13、公正的法律限制不了好的自由,因为好人不会去做法律不允许的事 情。——弗劳德
14、法律是为了保护无辜而制定的。——爱略特 15、像房子一样,法律和法律都是相互依存的。——伯克
适配器模式
适配器模式(Adapter Pattern)以下内容是我和小组的兄弟学习设计模式我做的课件,我整理出来和大家分享,有不妥之处敬请指出.上次做的桥接模式(Bridge),这次是适配器模式(Adapter).概述:在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现存对象”并不能满足我们新的应用环境。
怎样才能良好的复用这些对象,以满足我们的应用环境,这就是适配器(Adapter)所要解决的问题。
意图:将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
——《设计模式》GOF生活中的例子:在现实生活中,像这种适配器我们经常见到,而且还是经常使用它,如:手机(深信大家都见过),我们手机在充电的时候,不可能直接在220V电源上直接充电,而是手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电,这个“充电器”就起到了适配的作用。
1.类的Adapter模式结构图类结构图:代码实现:1namespace Adapter_Pattern2{3public interface ITarget4 {5void GetPower();6 }7///<summary>8/// 220V电源类;9///</summary>10public class Power11 {12///<summary>13///从电源中得到220V的电压; 14///</summary>15public void GetPoer220V()1718 }19 }20///<summary>21///适配器类(充电器);22///</summary>23public class Adapter : Power, ITarget24 {25///<summary>26///得到想要电压;27///</summary>28public void GetPower()29 {30this.GetPoer220V();31 Console.WriteLine("得到手机的充电电压!");32 }33 }客户端调用:1namespace Adapter_Pattern2{3class Program4 {5///<summary>6///这里相当于是手机;7///</summary>8///<param name="args"></param>9static void Main(string[] args)10 {11 Console.Write("手机:");12 ITarget Target = new Adapter();13 Target.GetPower();14 Console.Read();16 }17}特点:它使用多继承的方式来实现,我们只需要调用得到电压(GetPower())方法,由充电器(Adapter)去将220V的电压转成我们需要的电压供我们使用。
第9讲 适配器模式
分析
WebFormDesigner在本例中是Adaptee, WebFormDesigner_text_actionAdapter在本例中是Adapter, java.awt.event.ActionListener在本例中是适配目标。 适配目标为一接口,代码如下: public interface ActionListener extends EventListener { /** * Invoked when an action occurs. */ public void actionPerformed(ActionEvent e); } 适配目标中只有一个方法:actionPerformed()。由于 WebFormDesigner_text_actionAdapter 实现了 java.awt.event.ActionListener,所以要求实现actionPerformed()方法。 WebFormDesigner_text_actionAdapter实现actionPerformed()方法是引 用了WebFormDesigner这个adaptee来完成的。从代码中可以看出, WebFormDesigner是WebFormDesigner_text_actionAdapter的方法的参数, 所以WebFormDesigner_text_actionAdapter依赖WebFormDesigner。 Adaptee类(WebFormDesigner)的方法(text_actionPerformed)与Adapter 类(WebFormDesigner_text_actionAdapte)的方法(actionPerformed) 不同名而实现相同功能,这就是我们上面分析的基于对象的Adapter模式。
Adapter模式
05适配器模式
设计模式学习笔记-适配器模式1.概述将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
2. 解决的问题即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
3. 模式中的角色3.1 目标接口(Target):客户所期待的接口。
目标可以是具体的或抽象的类,也可以是接口。
3.2 需要适配的类(Adaptee):需要适配的类或适配者类。
3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
4. 模式解读注:在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式。
由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、java等语言都不支持多重继承,因而这里只是介绍对象适配器。
4.1 适配器模式的类图4.2 适配器模式的代码实现///<summary>///定义客户端期待的接口///</summary>public class Target{///<summary>///使用virtual修饰以便子类可以重写///</summary>public virtual void Request(){Console.WriteLine("This is a common request"); }}///<summary>///定义需要适配的类///</summary>public class Adaptee{public void SpecificRequest(){Console.WriteLine("This is a special request.");}}///<summary>///定义适配器///</summary>public class Adapter:Target{// 建立一个私有的Adeptee对象private Adaptee adaptee = new Adaptee();///<summary>///通过重写,表面上调用Request()方法,变成了实际调用SpecificRequest() ///</summary>public override void Request(){adaptee.SpecificRequest();}}4.3 客户端代码class Program{static void Main(string[] args){// 对客户端来说,调用的就是Target的Request()Target target = new Adapter();target.Request();Console.Read();}}运行结果5. 模式总结5.1 优点5.1.1 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。
第一节:适配器设计模式
第⼀节:适配器设计模式
⼀、⽣活中适配器例⼦
⼆、基本介绍
1、适配器模式(Adapter Pattern)将某个类的接⼝转换成客户端期望的另⼀个接⼝表⽰,主要⽬的是兼容性,让原本因接⼝不匹配不能⼀起⼯作的两个类可以协同⼯作,⼜被称为包装器(Wrapper)。
2、适配器模式属于结构型模式;
3、主要分为三类:类适配器、对象适配器模式、接⼝适配器模式;
三、适配器模式⼯作原理
1、适配器模式:将⼀个类的接⼝转换成另⼀种接⼝,让原本接⼝不兼容的类可以兼容;
2、从⽤户的⾓度看不到被适配者,是解耦的;
3、⽤户调⽤适配器转化出来的⽬标接⼝⽅法,适配器再调⽤者被适配者的相关接⼝⽅法;
4、⽤户收到反馈结果,感觉只是和⽬标接⼝交互,如图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/12/10
7
类适配器简单例子
public interface Print { public abstract void printWeak(); public abstract void printStrong();
} }
2020/12/10
9
对象适配器
Client
RequiredClass ______________ requiredMethod()
ExistingClass __________ usefulMethod()
} ============================ public class Main {
public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong();
2020/12/10
4
Adapter模式
Struct
class adapter
object adapter
2020/12/10
5
例子
《interface》
RocketSim getMass():double getThrust():double setSimTime(t:double)
PhysicalRocket
} -------------------------public class Banner {
private String string; public Banner(String string) {
this.string = string; } public void showWithParen() {
OozimozRocket
2020/12/10
6
public class OozinozRocket extends PhysicalRocket implements RocketSim{ private double time;
Public OozinozRocket(double burnArea,double burnRate,double fuelMass,double totalMass){ super(burnArea,burnRate,fuelMass,totalMass); }
2
2020/12/10
3
Adapter模式
Applicability:Use the Adapter pattern when you want to use an existing class, and its interface does not match the one you need. 你想使用一个已经存在的类,并且它的接口不符合要求。
you want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces.
PhysicalRocket( burnArea:double, burnRae:double, fueMass:double, totalMass:double) getBurnTime():double getMass(t:double):double getThrust(t:double):double
你想创建一个可以复用的类,该类可以与其他不相关的类或不 可预见的类(即那些接口可能不兼容的类)协同工作。
(object adapter only) you need to use several existing subclasses, but it‘s impractical to adapt their interface by subclassing every one. An object adapter can adapt the interface of its parent class.你想使用一些已经存在的子类,但 是不可能对每一个都进行子类化以匹配它们的接口。对象适配 器可以适配它们的父类接口。
假设有一图形编辑器,允许用接口:Shape,定义了图形对 象的基本接口服务。程序中所有图元对象均实 现该接口。
假设需要设计一个TextShape类,用来显示和 编辑正文。设计该类时希望用到现成的 TextView类,用来显示和编辑正文。
2020/12/10
适配器(Adaptor)模式
目的: 把一个已有的类用用户希望的形式描述;即用
用户希望的接口适配这个类。 在这个模式中,这个类叫做被适配者
(Adaptee),用户定义的接口叫适配接口, 用户实现适配接口的类叫适配器(Adaptor)。 也叫做,包装器(Wrapper)。
2020/12/10
1
Adapter
System.out.println("(" + string + ")"); } public void showWithAster() {
System.out.println("*" + string + "*"); } }
2020/12/10
8
public class PrintBanner extends Banner implements Print { public PrintBanner(String string) { super(string); } public void printWeak() { showWithParen(); } public void printStrong() { showWithAster(); }