软件设计模式(JAVA) 06_适配器模式_实验指导书

合集下载

java设计模式-适配器模式

java设计模式-适配器模式

java设计模式-适配器模式java适配器模式1、概述 什么是适配器模式? 适配器模式是⼀种结构型设计模式。

适配器模式就是:把⼀个类的接⼝变换成客户端所期待的另⼀种接⼝,从⽽使原本因接⼝不匹配⽽⽆法在⼀起⼯作的两个类能够在⼀起⼯作。

⽤电器来打个⽐喻:有⼀个电器的插头是三脚的,⽽现有的插座是两孔的,要使插头插上插座,我们需要⼀个插头转换器,这个转换器即是适配器。

适配器模式涉及3个⾓⾊:源(Adaptee):需要被适配的对象或类型,相当于插头。

适配器(Adapter):连接⽬标和源的中间对象,相当于插头转换器。

⽬标(Target):期待得到的⽬标,相当于插座。

2、适配器模式UML图 图⽚来⾃⽹络 通过上⾯UML图可以知道,客户端期待的接⼝或者对象通过适配器的转换得到了满⾜,Adapter通过内部包装Adaptee对象把源对象转换成客户端期待的对象。

3、适配器模式分类 适配器模式包括3种形式:1. 类适配器模式:类适配器使⽤的是继承的⽅式,⼀般来说⽆法对其⼦类进⾏适配2. 对象适配器模式:对象适配器使⽤的是组合的⽅式,⼦孙类都可以被适配。

另外,对象适配器对于增加⼀些新⾏为⾮常⽅便,⽽且新增加的⾏为同时适⽤于所有的源。

3. 接⼝适配器模式(⼜称缺省适配器模式):接⼝适配器模式(缺省适配模式)基本思想是,为⼀个接⼝提供缺省实现,这样⼦类可以从这个缺省实现进⾏扩展,⽽不必从原有接⼝进⾏扩展。

可以说对象适配器模式是另外6种结构型设计模式的起源(图⽚源⾃⽹络)。

4、三种适配器模式详解 适配器模式的三种实现⽅式及代码实例详解,⽤电器来打个⽐喻:有⼀个电器的插头是两脚的,⽽现有的插座是三孔的,要使插头插上插座,我们需要⼀个插头转换器,这个转换器即是适配器。

图⽚源⾃⽹络4.1、类适配器模式 类适配器使⽤的是继承的⽅式,⼀般来说⽆法对其⼦类进⾏适配,请看代码实例 1.⾸先我们有⼀个要被适配的类/*** 源(相当于两脚插头,也就是被适配的类)* @author ningbeibei*/public class Adaptee {public void adapteeMethod() {System.out.println("两脚插头,被适配的类....");}} 2.定义⼀个⽬标接⼝/*** ⽬标(客户所期待的类,可以是⼀个接⼝抽象类具体的类)* 相当于三孔插板* @author ningbeibei*/public interface Target {void targetMethod(); 3.定义适配器类 定义适配器类通过继承 Adaptee 和实现 Target 接⼝关联起来,/*** 类适配器模式(相当于转换器)* 通过Adapter类把Adaptee类与Target接⼝衔接起来* @author ningbeibei*/public class Adapter extends Adaptee implements Target {@Overridepublic void targetMethod() {//操作处理adapteeMethod();//操作处理}} 4.测试代码/*** 适配器模式测试类* @author ningbeibei*/public class test {public static void main(String[] args) {//类适配器模式Adapter adapter = new Adapter();adapter.targetMethod();}} 5.运⾏结果4.2、对象适配器模式 对象适配器使⽤的是组合的⽅式,它把源类作为属性放⼊适配器类中,请看代码实例 1.定义被适配的类/*** 源(相当于两脚插头,也就是被适配的类)* @author ningbeibei*/public class Adaptee {public void adapteeMethod() {System.out.println("两脚插头,被适配的类....");}} 2.定义⽬标接⼝/*** ⽬标(客户所期待的类,可以是⼀个接⼝抽象类具体的类)* 相当于三孔插板* @author ningbeibei*/public interface Target {void targetMethod();} 3.定义适配器类(类似于转换器) 注意:通过持有Adaptee属性建⽴与Target接⼝联系/*** 对象适配器模式(相当于转换器)* 通过持有Adaptee属性建⽴与Target接⼝联系* @author ningbeibei*/public class Adapter implements Target {//添加属性private Adaptee adaptee;public Adapter (Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void targetMethod() {//操作处理adaptee.adapteeMethod();//操作处理} 4.测试类/*** 适配器模式测试类* @author ningbeibei*/public class test {public static void main(String[] args) {//对象适配器模式Adapter adapter = new Adapter(new Adaptee());adapter.targetMethod();}} 5.结果输出4.3、接⼝适配器模式(缺省适配模式) 接⼝适配器模式⼜称缺省模式,这种模式通过抽象类对接⼝进⾏实现,在抽象类种对接⼝进⾏默认实现。

java设计模式—适配器模式

java设计模式—适配器模式

java设计模式—适配器模式关于JAVA适配器的解释 将⼀个类的接⼝转换成客户希望的另外⼀个接⼝。

Adapter模式使得原本由于接⼝不⽽不能⼀起⼯作的那些类可以⼀起⼯作。

——Gang of Four基本概念 客户:需要调⽤我们的代码的对象。

Adapter模式的宗旨:保留现有类所提供的服务,向客户提供接⼝,以满⾜客户的期望。

主要内容 (1)类适配器: 当客户在接⼝中定义了他期望的⾏为时,我们就可以应⽤适配器模式,提供⼀个实现该接⼝的类,并且扩展已有的类,通过创建⼦类来实现适配。

下⾯是类适配器的UML图: (2)对象适配器: 对象适配器”通过组合除了满⾜“⽤户期待接⼝”还降低了代码间的不良耦合。

在⼯作中推荐使⽤“对象适配”。

下⾯是对象适配器的UML 图: (3)缺省适配器模式: 缺省适配器模式是⼀种特殊的适配器模式,但这个适配器是由⼀个抽象类实现的,并且在抽象类中要实现⽬标接⼝中所规定的所有⽅法,但很多⽅法的实现都是“平庸”的实现,也就是说,这些⽅法都是空⽅法。

⽽具体的⼦类都要继承此抽象类。

适⽤情况 使⽤的前提: 1.接⼝中规定了所有要实现的⽅法 2.但⼀个要继承此接⼝的具体类,只⽤到了其中的⼏个⽅法,⽽其它的⽅法都是没有⽤的。

实现⽅法 1.⽤⼀个抽象类继承已有的接⼝,并实现接⼝中所规定的所有⽅法,这些⽅法的实现可以都是“平庸”实现----空⽅法;但此类中的⽅法是具体的⽅法,⽽不是抽象⽅法,否则的话,在具体的⼦类中仍要实现所有的⽅法,这就失去了适配器本来的作⽤。

2.原本要继承接⼝的⼦类,只继承1中的抽象类即可,并在其内部实现时,只对其感兴趣的⽅法进⾏实现。

注意事项 1.充当适配器⾓⾊的类就是:继承已有接⼝的抽象类 2.为什么要⽤抽象类: 此类是不要被实例化的。

⽽只充当适配器的⾓⾊,也就为其⼦类提供了⼀个共同的接⼝,但其⼦类⼜可以将精⼒只集中在其感兴趣的地⽅。

适配器模式解析 你想使⽤⼀个已经存在的适配器模式,⽽他的接⼝不符合你的需求。

软件设计模式(Java版)

软件设计模式(Java版)

8.3.1模式的定义与特点 8.3.2模式的结构与实现 8.3.3模式的应用实例 8.3.4模式的应用场景 8.3.5模式的扩展
8.4.1模式的定义与特点 8.4.2模式的结构与实现 8.4.3模式的应用实例 8.4.4模式的应用场景 8.4.5模式的扩展
9.1 UMLet的 1
使用与类图的 设计
1.3.1开闭原则 1.3.2里氏替换原则 1.3.3依赖倒置原则 1.3.4单一职责原则 1.3.5接口隔离原则 1.3.6迪米特法则 1.3.7合成复用原则 1.3.8 7种设计原则的要点
2.2单例模式
2.1创建型模式概 述
2.3原型模式
2.4本章小结
2.5习题
2.2.1模式的定义与特点 2.2.2模式的结构与实现 2.2.3模式的应用实例 2.2.4模式的应用场景 2.2.5模式的扩展
9.3.1实验目的 9.3.2实验原理 9.3.3实验内容 9.3.4实验要求 9.3.5实验步骤
9.4.1实验目的 9.4.2实验原理 9.4.3实验内容 9.4.4实验要求 9.4.5实验步骤
作者介绍
这是《软件设计模式(Java版)》的读书笔记模板,暂无该书作者的介绍。
读书笔记
这是《软件设计模式(Java版)》的读书笔记模板,可以替换为自己的心得。
目录分析
1
1.1软件设计 模式概述
2
1.2 UML中的 类图
3
1.3面向对象 的设计原则
4
1.4本章小结
5
1.5习题
1.1.1软件设计模式的产生背景 1.1.2软件设计模式的概念与意义 1.1.3软件设计模式的基本要素 1.1.4 GoF的23种设计模式简介
1.2.1统一建模语言简介 1.2.2类、接口和类图 1.2.3类之间的关系

设计模式试验--适配器模式、装饰模式

设计模式试验--适配器模式、装饰模式

浙江工商大学计算机与信息工程学院学期上机实验报告课程名称:设计模式姓名:学号:指导教师:班级:日期:【一】实验目的:(1)掌握结构型设计模式的意图、使用方法和优缺点,包括适配器模式、装饰模式、外观模式。

【二】实验内容:(1) 假设某系统中使用了一个第三方的日志记录工具,该日志记录工具支持数据库日志记录DatabaseLog和文本文件记录FileLog两种方式,如图1所示,它提供给的API接口是Write()方法,使用方法如下:Log.Write("Logging Message!");图1由于某种原因不能继续使用该日志记录工具了,需要采用另外一个日志记录工具,它同样也支持数据库日志记录DatabaseLog和文本文件记录FileLog两种方式,如图2所示,只不过它提供的API接口是WriteLog()方法,使用方法如下:Log.WriteLog("Logging Message!");图2现要求设计一个解决方案,使得在不修改原有程序的基础上,能实现日志工具的替换。

(2)Java I/O包的类关系图如图3所示,其中FilterInputSteam为装饰类。

要求编写一个装饰者,把输入流内的所有小写字符转换为大写字符。

图3【三】完成报告(预备知识、步骤、程序框图、程序、思考等):第一题UML类图:Java代码:ClientDemo.java/*** @author ******/public class ClientDemo {public static void main (String args[]){ ILog newLog = new Adapter();newLog.write();}}ILog.java/*** @author ******/public interface ILog {public void write();}DatabaseLog.java/*** @author ******/public class DatabaseLog implements ILog { public void write(){System.out.println("数据库日志记录");}}FileLog.java/*** @author ******/public class FileLog implements ILog {public void write(){System.out.println("文本文件记录");}}Adapter.java/*** @author ******/public class Adapter extends LogAdaptee implements ILog { public void write(){super.writeLog();System.out.println("适配器转换。

Java设计模式--适配器模式详解

Java设计模式--适配器模式详解

Java设计模式--适配器模式详解⽬录定义结构⽰例扩展总结定义适配器模式⽤于解决接⼝间的兼容问题。

当我们需要使⽤某个类提供的接⼝,但是这个接⼝与现在的系统需求不符,由于该接⼝是由第三⽅提供的,或者是已经在⽣产上跑了很久的存量类,我们不想通过改变这个类来满⾜现在系统的需求,那么这时候就可以考虑通过将⽬标类封装成⼀个满⾜系统需求的新类,因此适配器(Adapter)也称为包装器(Wrapper)。

结构适配器模式包含如下⾓⾊:Target:⽬标抽象类,客户类期望的接⼝。

Adapter:适配器类,适配器模式的核⼼,实现⽬标抽象类和适配者类的转换。

Adaptee:适配者类,与⽬前需求不兼容的类,即需要被包装的类。

Client:客户类,调⽤在⽬标抽象类中定义的业务⽅法。

适配器模式有类适配器和对象适配器两种实现:1、在类适配器模式中,适配器类实现了⽬标抽象类接⼝并继承了适配者类,在⽬标抽象类的实现⽅法中调⽤所继承的适配者类的⽅法。

2、在对象适配器模式中,适配器类实现了⽬标抽象类并定义了⼀个适配者类的对象实例,在⽬标抽象类的实现⽅法中调⽤适配者类实例的⽅法。

⽰例假如我们⼿上有⼀只⼿机,它只有⼀个type-c接⼝,同时⼿上有⼀条3.5mm的⽿机,想听⾳乐的时候就会发现⼆者不兼容,相较于更换⼿机或者⽿机,⼀般我们会选择⼀条type-c和3.5mm的转接线来实现最⾼性价⽐。

此时将3.5mm⽿机⽐作客户端(客户类),它期望得到⾳乐信号的⽬标是3.5mm接⼝(⽬标抽象类),type-c接⼝则是⼿机提供的⾳乐信号传输接⼝(适配者类),与⽿机接头不兼容,⽽转接线(适配器类)可以将type-c接⼝包装为⽿机可以插⼊的3.5mm接⼝,能够解决⼿机与⽿机的不兼容问题,实现⽤⽿机接收⼿机播放的⾳乐信号。

1、定义⽬标抽象类,即客户类期望的接⼝。

public interface ThreePointFiveConn {//⼀个提供⾳乐的3.5mm接⼝public void playMusic(String connector);}2、定义适配者类,即需要被包装的类。

《Java设计模式》实验指导书(程细柱)

《Java设计模式》实验指导书(程细柱)
2、Chain of Responsibility 模式的工作原理 职责链模式(Chain of Responsibility):为了避免将请求发送者与接收者耦合在一起,让 多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有 对象处理它为止。如学生请假的职责链如下:
职责链模式的 UML 类图如下:
态工厂(Polymorphic Factory)模式,在工厂方法模式中,工厂父类负责定义创建产品对象的
公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作
延迟到工厂子类中完成。它的 UML 类图如下:
Product
Factory
+ factoryMethod () : Product
二、实验原理 1、行为型模式的工作原理 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。行为
型模式分为:类行为型模式和对象行为型模式两种。其中,类的行为型模式使用继承关系在 几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责;对象的 行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等 方 式 来 分 配 两 个 或 多 个 类 的 职 责 。 行 为 型 模 式 也 可 以 分 为 : 职 责 链 模 式 (Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介 者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模 式(Strategy)、模板方法模式(Template Method)、访问者模式(Visitor)等十一类。

java设计模式之适配器模式

java设计模式之适配器模式

java设计模式之适配器模式
结构型模式之适配器模式
将⼀个类的接⼝转换成客户希望的另外⼀个接⼝,使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类能⼀起⼯作。

适配器模式分为:类适配器模式和对象适配器模式。

类适配器模式通过继承和实现⽅式来实现,对象适配器模式通过聚合和组合关系来实现,前者类之间的耦合度⽐后者⾼,且要求程序员了解现有组件库中的相关组件的内部结构,所以应⽤相对较少些。

适配器模式的结构:
适配器模式(Adapter)包含以下主要⾓⾊:
⽬标接⼝(Target):当前系统业务所期待的接⼝,它可以是抽象类或接⼝。

适配者类(Adaptee):它是被访问和适配的现存组件库中的组件接⼝。

适配器类(Adapter):它是⼀个转换器,通过继承或引⽤适配者的对象,把适配者接⼝转换成⽬标接⼝,让客户按⽬标接⼝的格式访问适配者。

类适配器模式:
实现⽅式:定义⼀个适配器类来实现当前系统的业务接⼝,同时⼜继承现有组件库中已经存在的组件。

类适配器模式违背了合成服⽤原则。

类适配器是客户类有⼀个接⼝规范的情况下可⽤,反之不可⽤。

对象适配器模式:
实现⽅式:对象适配器模式可采⽤将现有组件库中已经实现的组件引⼊适配器类中,该类同时实现当前系统的业务接⼝。

注意:还有⼀个适配器模式是接⼝适配器模式,当不希望实现⼀个接⼝中所有的⽅法是,可以创建⼀个抽象类Adapter,实现所有⽅法。

⽽此时我们只需要继承该抽象类即可。

应⽤场景:
以前开发的系统存在满⾜新系统功能需求的类,但其接⼝同新系统的接⼝不⼀致。

使⽤第三⽅提供的组件时,但组件接⼝定义和⾃⼰要求的接⼝定义不同。

Java设计模式-适配器模式

Java设计模式-适配器模式

Java设计模式-适配器模式概念: 将⼀个类的接⼝,转换成客户期望的另⼀个接⼝。

适配器模式让原来接⼝不兼容的类可以在⼀起⼯作。

解决的问题: 提供类似于中间⼈的作⽤:把原本不兼容、不能⼀起⼯作的接⼝组合在⼀起,使得它们能够在⼀起正常的⼯作。

模式结构: 有两种适配器模式:对象适配器和类适配器。

因为类适配器需要使⽤到多重继承,⽽Java不⽀持多重继承,所以本⽂就只对对象适配器进⾏解释。

模式中的⾓⾊: Target(⽬标接⼝):客户请求的接⼝。

Adapter必须要实现这个接⼝(也可以是抽象类)。

Adapter(适配器类):实现Target接⼝,组合⽤户所需要的类。

Adaptee(被适配者):请求最终的执⾏者。

UML图: 这种适配器模式充满着良好的OO设计原则:使⽤对象组合,以修改的接⼝包装被适配者:这种做法还有额外的优点,那就是,被适配者的任何⼦类,都可以搭配着适配器使⽤。

情景导⼊: 某个玩具⼚商的⽤户需要⼀种能学鸭⼦叫的玩具鸡,怎么办? ⼚商想这还不容易:我只要⽣产⼀个玩具鸡的外形,将它的发⾳功能委托⽣产玩具鸭的⽣产线负责。

也就是说:外表看上去是玩具鸡,但发⾳这个功能有玩具鸭实现。

1package com.tony.Adapter;23/**4 * Target接⼝,接收⽤户请求。

5 * 玩具鸡6*/7public interface Chicken {89void speak();10 }1package com.tony.Adapter;23/**4 * 玩具鸭接⼝5 * ⾯向接⼝编程是⼀种好习惯6*/7public interface Duck {89void speak();10 }1package com.tony.Adapter;23/**4 * Adapter5 * 玩具鸡适配器,将发⾳请求委托给玩具鸭。

6*/7public class ChickenAdapter implements Chicken { 89private Duck duck;1011public ChickenAdapter(){12 duck = new ToyDuck();13 }14 @Override15public void speak() {16 duck.speak();17 }1819 }1package com.tony.Adapter;23/**4 * Adaptee5 * 被适配者,请求的真正执⾏者。

深入浅出Java设计模式之适配器模式

深入浅出Java设计模式之适配器模式

通常,客户类(clients of class)通过类的接口访问它提供的服务。

有时,现有的类(existing class)可以提供客户类的功能需要,但是它所提供的接口不一定是客户类所期望的。

这是由于现有的接口太详细或者缺乏详细或接口的名称与客户类所查找的不同等诸多不同原因导致的。

在这种情况下,现有的接口需要转化(convert)为客户类期望的接口,这样保证了对现有类的重用。

如果不进行这样的转化,客户类就不能利用现有类所提供的功能。

适配器模式(Adapter Pattern)可以完成这样的转化。

适配器模式建议定义一个包装类,包装有不兼容接口的对象。

这个包装类指的就是适配器(Adapter),它包装的对象就是适配者(Adaptee)。

适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。

换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。

因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作(work together)。

在上面讨论的接口:(1)不是指在JAVA编程语言中接口的概念,虽然类的接口可以通过JAVA借扩来定义。

(2)不是指由窗体和GUI控件所组成的GUI应用程序的用户接口。

(3)而是指类所报漏的,被其他类调用的编程接口,类适配器(Class Adapter)VS对象适配器(Object Adapter)适配器总体上可以分为两类??类适配器(Class Adapter)VS对象适配器(Object Adapter)类适配器:类适配器是通过继承类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口。

当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。

对象适配器:对象适配器包含一个适配器者的引用(reference),与类适配器相同,对象适配器也实现了客户类需要的接口。

软件设计模式(JAVA) 06_适配器模式_实验指导书

软件设计模式(JAVA) 06_适配器模式_实验指导书

实验(上机)六适配器模式实验(上机)目的1、练习使用结构型设计模式;2、练习使用适配器模式的设计思路;3、练习使用适配器模式实现“教务学生成绩排序查找”案例的实现。

实验(上机)课时2学时实验(上机)环境JDK1.8\Eclipse Mars预备知识1、结构型模式;2、适配器模式概述;3、适配器模式的结构与实现;4、适配器模式的应用实例;5、缺省适配器模式;6、双向适配器模式;7、适配器模式的优缺点与适用环境。

实验(上机)内容在为某学校开发教务管理系统时,开发人员发现需要对学生成绩进行排序和查找,该系统的设计人员已经开发了一个成绩操作接口ScoreOperation,在该接口中声明了排序方法Sort(int[]) 和查找方法Search(int[], int),为了提高排序和查找的效率,开发人员决定重用现有算法库中的快速排序算法类QuickSortClass和二分查找算法类BinarySearchClass,其中QuickSortClass的QuickSort(int[])方法实现了快速排序,BinarySearchClass的BinarySearch (int[], int)方法实现了二分查找。

由于某些原因,开发人员已经找不到该算法库的源代码,无法直接通过复制和粘贴操作来重用其中的代码;而且部分开发人员已经针对ScoreOperation接口(自己开发的接口)编程,如果再要求对该接口进行修改或要求大家直接使用QuickSortClass类和BinarySearchClass类将导致大量代码需要修改。

现使用适配器模式设计一个系统,在不修改已有代码的前提下将类QuickSortClass 和类BinarySearchClass的相关方法适配到ScoreOperation接口中。

新建解决方案,新建一个控制台应用程序,编写适配器模式类实现代码,实现以上需求的案例,要求编写为控制台应用程序,并能调试运行。

JAVA设计模式之适配器模式

JAVA设计模式之适配器模式

JAVA设计模式之适配器模式1 初步认识适配器模式的定义 将⼀个类的接⼝转成客户期望的另外⼀个接⼝。

适配器模式使得原本由于接⼝不匹配⽽不能⼀起⼯作的那些类可以⼀起⼯作。

⼤⽩话 适配器模式就像旅⾏插座转换器(图1)、Type-c转VGA转接⼝(图4)⼀样。

图1. 图⽚来源⽹络图2. 图⽚来源⽹络 去过⾹港迪拜等的同学都知道,那边⽤的插座跟我们不⼀样,他们的插座需要如图2第1⾯所⽰的插头,⽽我们常⽤的插座类似第2⾯。

因此我们的笔记本电脑,⼿机在当地不能直接充电。

所以就需要⼀个插座转换器,转换器第1⾯插⼊当地的插座,第2⾯供我们充电,这样使得我们的插头在当地能使⽤。

Type-c转VGA转接⼝也是⼀样的道理。

2 适配器模式结构图图3. 适配模式结构图来源⽹络 如图所⽰,Client不能直接访问Adaptee。

Adapter是适配器,它将Adaptee转换成Client能访问的接⼝。

所以通过适配器Adapter,⽤户端就可以访问Adaptee。

3 使⽤场景例⼦ ⼿机想要投影到投影仪上,由于⼿机是Type-c接⼝,投影仪是VGA接⼝。

不能直接投影,需要⼀个适配器,将视频信号从Type-c⼝转到VGA⼝,最后才能输出到⼤屏幕上。

4 适配器模式在使⽤场景的具体实现图4. typec转vga/hdm转换器 如图所⽰,这有⼀个适配器,⼀号⼝是typec⼝,⼆号⼝是vga⼝,只有将视频信号从typec⼝输⼊,转换输出到vga⼝,才能和投影仪对接,实现⼿机屏幕投影到投影仪上的任务。

涉及的物品有:⼿机、适配器、投影仪。

4.1 定义⼀个⼿机,它有个typec⼝,这是视频源。

package com.jstao.adapter;/*** @author jstao* 定义⼀个⼿机Phone,它有⼀个Typec接⼝。

**/public class Phone {public void typecPhone() {System.out.println("信息从Typec⼝的⼿机输出。

java设计模式之适配器模式

java设计模式之适配器模式

java设计模式之适配器模式【学习难度:★★☆☆☆,使⽤频率:★★★★☆】我的笔记本电脑的⼯作电压是20V,⽽我国的家庭⽤电是220V,如何让20V的笔记本电脑能够在220V的电压下⼯作?答案是引⼊⼀个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,⽣活⽤电和笔记本电脑即可兼容,如图9-1所⽰:图9-1 电源适配器⽰意图在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引⼊⼀个电源适配器⼀样引⼊⼀个称之为适配器的⾓⾊来协调这些存在不兼容的结构,这种设计⽅案即为适配器模式。

9.1 没有源码的算法库Sunny软件公司在很久以前曾开发了⼀个库,⾥⾯包含了⼀些常⽤的算法,例如排序算法和查找算法,在进⾏各类软件开发时经常需要重⽤该算法库中的算法。

在为某学校开发教务管理系统时,开发⼈员发现需要对学⽣成绩进⾏排序和查找,该系统的设计⼈员已经开发了⼀个成绩操作接⼝ScoreOperation,在该接⼝中声明了排序⽅法sort(int[]) 和查找⽅法search(int[], int),为了提⾼排序和查找的效率,开发⼈员决定重⽤算法库中的快速排序算法类QuickSort和⼆分查找算法类BinarySearch,其中QuickSort的quickSort(int[])⽅法实现了快速排序,BinarySearch 的binarySearch (int[], int)⽅法实现了⼆分查找。

由于某些原因,现在Sunny公司开发⼈员已经找不到该算法库的源代码,⽆法直接通过复制和粘贴操作来重⽤其中的代码;部分开发⼈员已经针对ScoreOperation接⼝编程,如果再要求对该接⼝进⾏修改或要求⼤家直接使⽤QuickSort类和BinarySearch类将导致⼤量代码需要修改。

Sunny软件公司开发⼈员⾯对这个没有源码的算法库,遇到⼀个幸福⽽⼜烦恼的问题:如何在既不修改现有接⼝⼜不需要任何算法库代码的基础上能够实现算法库的重⽤?通过分析,我们不难得知,现在Sunny软件公司⾯对的问题有点类似本章最开始所提到的电压问题,成绩操作接⼝ScoreOperation好⽐只⽀持20V电压的笔记本,⽽算法库好⽐220V的家庭⽤电,这两部分都没有办法再进⾏修改,⽽且它们原本是两个完全不相关的结构,如图9-2所⽰:图9-2 需协调的两个系统的结构⽰意图现在我们需要ScoreOperation接⼝能够和已有算法库⼀起⼯作,让它们在同⼀个系统中能够兼容,最好的实现⽅法是增加⼀个类似电源适配器⼀样的适配器⾓⾊,通过适配器来协调这两个原本不兼容的结构。

JAVA设计模式详解(五)----------适配器模式

JAVA设计模式详解(五)----------适配器模式

JAVA设计模式详解(五)----------适配器模式 各位朋友好,本章节我们继续讲第五个设计模式。

  在⽣活中,我们都知道⼿机内存卡是⽆法直接接电脑的,因为内存卡的卡槽⽐较⼩,⽽电脑只有USB插孔,此时我们需要⽤到读卡器。

这个读卡器就相当于是适配器。

这是⽣活上的适配器,那么在OO对象中,适配器就是将⼀个接⼝转换成另⼀个接⼝,使得客户可以使⽤。

适配器模式从实现⽅式上分为两种,类适配器和对象适配器,这两种的区别在于实现⽅式上的不同,⼀种采⽤继承,⼀种采⽤组合的⽅式。

下⾯我们来看⼀个例⼦,下⾯有两个接⼝,⼀个是⿅(Deer),⼀个是狼(wolf),public interface Deer {public void run();public void eatGrass();}interface Wolf{public void run();public void eatMeat();}我们让梅花⿅(SikaDeer)和雪狼(SnowWolf)分别实现这两个接⼝class SikaDeer implements Deer{@Overridepublic void run() {System.out.println("我在跑");}@Overridepublic void eatGrass() {System.out.println("我在吃草");}}class SnowWolf implements Wolf{@Overridepublic void run() {System.out.println("我在跑");}@Overridepublic void eatMeat() {System.out.println("我在吃⾁");}}假设现在狼要吃⿅,但是他要伪装成⿅然后混进去,那么现在因为接⼝不同,⽆法伪装,所以现在我们帮它写个适配器:class SnowAdapter implements Deer{//⾸先我们需要实现想转换成的接⼝,也就是⿅要看到的接⼝private SnowWolf snowWolf;public SnowAdapter(SnowWolf snowWolf) {this.snowWolf = snowWolf;//接着取得我们要适配的对象的引⽤}@Overridepublic void run() {snowWolf.run();//接着实现接⼝的⽅法}@Overridepublic void eatGrass() {snowWolf.eatMeat();}}接下来我们写个测试类:public class TestAdapter {public static void main(String[] args) {Deer sikaDeer = new SikaDeer();//先来个梅花⿅SnowWolf snowWolf = new SnowWolf();//再来个雪狼SnowAdapter snowAdapter = new SnowAdapter(snowWolf);//接下来是伪装后的雪狼System.out.println("snowWolf:");snowWolf.run();snowWolf.eatMeat();System.out.println("sikaDeer says:");testDeer(sikaDeer);System.out.println("snowAdapter says:");testDeer(snowAdapter);}public static void testDeer(Deer deer){deer.run();deer.eatGrass();}}结果展⽰:在这⾥,我们来分析⼀下这个过程,⿅是我们的⽬标接⼝,梅花⿅是依据⿅实现的,⽽适配器实现了⽬标接⼝,并持有被适配者(雪狼)的实例。

Java设计模式之《适配器模式》及应用场景

Java设计模式之《适配器模式》及应用场景

Java设计模式之《适配器模式》及应⽤场景出处地址 适配器就是⼀种适配中间件,它存在于不匹配的⼆者之间,⽤于连接⼆者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。

适配器模式有两种:类适配器、对象适配器、接⼝适配器 前⼆者在实现上有些许区别,作⽤⼀样,第三个接⼝适配器差别较⼤。

1、类适配器模式: 原理:通过继承来实现适配器功能。

当我们要访问的接⼝A中没有我们想要的⽅法,却在另⼀个接⼝B中发现了合适的⽅法,我们⼜不能改变访问接⼝A,在这种情况下,我们可以定义⼀个适配器p来进⾏中转,这个适配器p要实现我们访问的接⼝A,这样我们就能继续访问当前接⼝A中的⽅法(虽然它⽬前不是我们的菜),然后再继承接⼝B的实现类BB,这样我们可以在适配器P中访问接⼝B的⽅法了,这时我们在适配器P中的接⼝A⽅法中直接引⽤BB中的合适⽅法,这样就完成了⼀个简单的类适配器。

详见下⽅实例:我们以ps2与usb的转接为例ps2接⼝:Ps21 public interface Ps2 {2 void isPs2();3 }USB接⼝:Usb1 public interface Usb {2 void isUsb();3 }USB接⼝实现类:Usber1 public class Usber implements Usb {23 @Override4 public void isUsb() {5 System.out.println("USB⼝");6 }78 }适配器:Adapter1 public class Adapter extends Usber implements Ps2 {23 @Override4 public void isPs2() {5 isUsb();6 }78 }测试⽅法:Clienter1 public class Clienter {23 public static void main(String[] args) {4 Ps2 p = new Adapter();5 p.isPs2();6 }78 }显⽰结果:USB⼝实例讲解: 我⼿中有个ps2插头的设备,但是主机上只有usb插头的插⼝,怎么办呢?弄个转换器,将ps2插头转换成为USB插头就可以使⽤了。

设计模式之适配器模式

设计模式之适配器模式

设计模式之适配器模式设计模式是软件开发中常用的解决方案,它提供了一种被广泛认可的、可重用的解决方案模板。

一种常用的设计模式是适配器模式,它用于将一个类的接口转换成客户端所期待的另一种接口。

本文将介绍适配器模式的概念、应用场景和实现方法。

一、概述适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行协同工作。

适配器通过包装已有的类,将现有的接口转换成客户端所期待的接口,使得原本由于接口不兼容而无法工作的类可以一起协同工作。

适配器模式通常用于以下几种情况:1. 需要使用一个已经存在的类,但其接口与所需接口不一致。

2. 需要创建一个可复用的类,该类可与多个不相关的或不可预见的类一起工作。

二、应用场景适配器模式在实际应用中具有广泛的应用场景,以下是几个常见的应用场景:1. 与第三方库的集成当我们使用第三方库时,其提供的接口可能与我们当前系统的接口不兼容,此时可以使用适配器模式来将第三方库的接口转换成我们需要的接口。

2. 兼容性问题当我们需要更新或迁移系统时,可能需要进行接口的变更,这时适配器模式可以用来保持旧的接口兼容性,同时实现新的接口。

3. 数据格式转换在数据处理过程中,可能会面临不同格式的数据,适配器模式可以用来实现不同格式的数据之间的转换,使得系统能够更好地处理数据。

三、实现方法适配器模式可以通过类适配器和对象适配器两种方式来实现。

1. 类适配器类适配器使用多重继承来实现适配器功能。

它继承了原始类,并实现了目标接口。

通过在适配器类中调用原始类的方法来实现接口的转换。

2. 对象适配器对象适配器使用组合来实现适配器功能。

它持有原始类的实例,并实现了目标接口。

通过调用原始类实例的方法来实现接口的转换。

四、示例代码下面是一个使用对象适配器实现适配器模式的示例代码:```java// 目标接口interface Target {void request();}// 原始类class Adaptee {void specificRequest() {System.out.println("Adaptee specificRequest");}}// 适配器类class Adapter implements Target {private Adaptee adaptee;Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();}}// 客户端使用class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}}```在上述代码中,通过适配器类Adapter将原始类Adaptee的接口转换成目标接口Target,从而实现了不兼容接口之间的协同工作。

设计模式实验报告-适配器模式

设计模式实验报告-适配器模式

实验三:适配器模式实验内容被适配的类可以把一个Calendar类型的日期按照类似于“2020年11月25日”格式输出。

现输入类似“2020.11.2”,“2020-11-2”的内容,使用对象适配器和类适配器完成按照格式的输出。

对象适配器模式UML设计图1对象适配器模式类图核心代码Target.java核心代码Adaptee.java核心代码ObjectDotAdapter.java核心代码实现效果图2对象适配器模式实现效果图类适配器模式UML设计图3类适配器模式类图核心代码Target.java核心代码Adaptee.java核心代码ClassAdapter.java核心代码实现效果图 4 类适配器模式实现效果图实验体会依赖关系是类与类之间的联接。

依赖关系表示一个类依赖于另一个类的定义。

一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。

关联关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。

关联可以是双向的,也可以是单向的。

在Java语言中,关联关系一般使用成员变量来实现。

聚合关系是关联关系的一种,是强的关联关系。

聚合是整体和个体之间的关系。

例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。

与关联关系一样,聚合关系也是通过实例变量实现的。

但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。

组合关系是关联关系的一种,是比聚合关系强的关系。

它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。

代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。

代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。

换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。

Java实现适配器模式

Java实现适配器模式

Java实现适配器模式适配器模式(Adapter)适配器模式涉及到3个⾓⾊:要被适配的接⼝,适配器,⽬标接⼝适配器的⼯作就是将被适配的接⼝转换为⽬标接⼝“鸭⼦类型”就是⼀个典型的适配器模式:如果它⾛起来像鸭⼦,叫起来像鸭⼦,那么它就是⼀只鸭⼦。

适配器模式⽰例:⼥⼉国只有⼥⼈能加⼊,现在让唐僧加⼊⼥⼉国定义要被适配的接⼝与⽬标接⼝⽬标接⼝:⼥⼈接⼝,⼥⼈只会唱歌public interface Female{void sing();}要被适配的接⼝:男⼈接⼝,男⼈只会打架public interface Male{void fight();}唐僧是⼀个男⼈,只会打架,不会唱歌public class TangSeng implements Male{@Overridepublic void fight(){System.out.println("阿弥陀佛");}}现在,⼥⼉国中只有⼥⼈才能加⼊public class FemaleCountry{private final Set<Female> females;public FemaleCountry(){this.females=new HashSet<>();}// 只有⼥⼈可以加⼊public void join(Female female){females.add(female);}}但是,唐僧⼀⼼要加⼊⼥⼉国,他有什么办法呢?到了适配器出马的时候了// 适配器实现⽬标接⼝public class MaleAdapter implements Female{// 适配器内部包装了要被适配的对象private Male male;public MaleAdapter(Male male){this.male = male;}// 表⾯是在唱歌,实际上是在打架@Overridepublic void sing(){System.out.println("敢问圣僧,⼥⼉美不美?");male.fight();}}现在,男⼈已经可以适配⼥⼈接⼝了,让唐僧加⼊⼥⼉国public static void main(String[] args){FemaleCountry country=new FemaleCountry();// ⽤适配器包装MaleAdapter tangseng=new MaleAdapter(new TangSeng()); // 唐僧也会唱歌tangseng.sing();// 唐僧也可以加⼊⼥⼉国country.join(tangseng);System.out.println(country);}。

java设计模式之适配器模式

java设计模式之适配器模式

java设计模式之适配器模式 说到适配器,我们可能会想到电脑的适配器,没错,其实作⽤是⼀样的,电脑的适配器在中国可以使⽤,在美国也可以使⽤,它的主要作⽤是在新接⼝和⽼接⼝之间进⾏适配。

这就是⼀个适配的过程,适配器模式的类图如下: 这个类图是我在其他的地⽅截到的,我以前觉的类图特别不好看,慢慢接触之后发现类图和流程图都特别有意义,⼀看就特别的清晰。

整个流程就是通过Adapter把Adaptee转换为⽬标(Target)的⼦类。

既然已经知道原理了,那下⾯开始码代码吧。

我来举例⼀个场景吧,经常需要使⽤到投影仪,但是有⼀些⼈的电脑并不⽀持投影仪的⼤⼝,只能使⽤适配器了。

那就是可以把⼩⼝转换为⼤⼝。

package com.roc.adapter;/*** 投影仪⽀持的⼤⼝* @author liaowp**/public interface BigPort {public void userBigPort();//使⽤的⼤⼝}package com.roc.adapter;/*** 电脑的⼩⼝* @author liaowp**/public interface SmallPort {public void userSmallPort();//使⽤⼩⼝}package com.roc.adapter;/*** 适配器模式* @author liaowp**/public class SmallToBig implements BigPort{private SmallPort smallPort;//⼩⼝public SmallToBig(SmallPort smallPort){//获得⼩⼝this.smallPort=smallPort;}public void userBigPort() {erSmallPort(); //使⽤⼩⼝}}package com.roc.adapter;/*** 客户端* @author liaowp**/public class Client {public static void main(String[] args) {SmallPort smallPort = new SmallPort() {//电脑⾃带⼩⼝public void userSmallPort() {System.out.println("使⽤的是电脑⼩⼝");}};//需要⼀个⼤⼝才可以投影,⼩⼝转换为⼤⼝BigPort bigPort=new SmallToBig(smallPort);erBigPort();//电脑⼩⼝⼯作中实现了适配}}下⾯说⼀下适配器的优缺点:优点:1、将⽬标类和适配者类解耦2、增加了类的透明性和复⽤性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,⽽且提⾼了适配者的复⽤性3、灵活性和扩展性都⾮常好,符合开闭原则类适配器还有的优点:1、由于适配器类是适配者类的⼦类,因此可以再适配器类中置换⼀些适配者的⽅法,使得适配器的灵活性更强。

详解Java实践之适配器模式

详解Java实践之适配器模式

详解Java实践之适配器模式⽬录⼀、前⾔⼆、适配器模式介绍三、案例场景模拟3.1、场景模拟⼯程3.2、场景简述3.2.1、注册开户MQ3.2.2、内部订单MQ3.2.3、第三⽅订单MQ3.2.4、查询⽤户内部下单数量接⼝3.2.5、查询⽤户第三⽅下单⾸单接⼝四、代码实现4.1、⼯程结构4.2、Mq接收消息实现五、适配器模式重构代码5.1、⼯程结构5.2、代码实现(MQ消息适配)5.2.1、统⼀的MQ消息体5.2.2、MQ消息体适配类5.2.3、测试适配类5.3、代码实现(接⼝使⽤适配)5.3.1、定义统⼀适配接⼝5.3.2、分别实现两个不同的接⼝5.3.3、测试适配类六、总结⼀、前⾔⼯作到3年左右很⼤⼀部分程序员都想提升⾃⼰的技术栈,开始尝试去阅读⼀些源码,例如Spring、Mybaits、Dubbo等,但读着读着发现越来越难懂,⼀会从这过来⼀会跑到那去。

甚⾄怀疑⾃⼰技术太差,慢慢也就不愿意再触碰这部分知识。

⽽这主要的原因是⼀个框架随着时间的发展,它的复杂程度是越来越⾼的,从最开始只有⼀个⾮常核⼼的点到最后开枝散叶。

这就像你⾃⼰开发的业务代码或者某个组件⼀样,最开始的那部分核⼼代码也许只能占到20%,⽽其他⼤部分代码都是为了保证核⼼流程能正常运⾏的。

所以这也是你读源码费劲的⼀部分原因。

框架中⽤到了设计模式吗?框架中不仅⽤到设计模式还⽤了很多,⽽且有些时候根本不是⼀个模式的单独使⽤,⽽是多种设计模式的综合运⽤。

与⼤部分⼩伙伴平时开发的CRUD可就不⼀样了,如果都是if语句从上到下,也就算得不上什么框架了。

就像你到Spring的源码中搜关键字Adapter,就会出现很多实现类,例如;UserCredentialsDataSourceAdapter。

⽽这种设计模式就是我们本⽂要介绍的适配器模式。

适配器在⽣活⾥随处可见如果提到在⽇常⽣活中就很多适配器的存在你会想到什么?在没有看后⽂之前可以先思考下。

⼆、适配器模式介绍适配器模式的主要作⽤就是把原本不兼容的接⼝,通过适配修改做到统⼀。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验(上机)六适配器模式实验(上机)目的1、练习使用结构型设计模式;2、练习使用适配器模式的设计思路;3、练习使用适配器模式实现“教务学生成绩排序查找”案例的实现。

实验(上机)课时2学时实验(上机)环境JDK1.8\Eclipse Mars预备知识1、结构型模式;2、适配器模式概述;3、适配器模式的结构与实现;4、适配器模式的应用实例;5、缺省适配器模式;6、双向适配器模式;7、适配器模式的优缺点与适用环境。

实验(上机)内容在为某学校开发教务管理系统时,开发人员发现需要对学生成绩进行排序和查找,该系统的设计人员已经开发了一个成绩操作接口ScoreOperation,在该接口中声明了排序方法Sort(int[]) 和查找方法Search(int[], int),为了提高排序和查找的效率,开发人员决定重用现有算法库中的快速排序算法类QuickSortClass和二分查找算法类BinarySearchClass,其中QuickSortClass的QuickSort(int[])方法实现了快速排序,BinarySearchClass的BinarySearch (int[], int)方法实现了二分查找。

由于某些原因,开发人员已经找不到该算法库的源代码,无法直接通过复制和粘贴操作来重用其中的代码;而且部分开发人员已经针对ScoreOperation接口(自己开发的接口)编程,如果再要求对该接口进行修改或要求大家直接使用QuickSortClass类和BinarySearchClass类将导致大量代码需要修改。

现使用适配器模式设计一个系统,在不修改已有代码的前提下将类QuickSortClass 和类BinarySearchClass的相关方法适配到ScoreOperation接口中。

新建解决方案,新建一个控制台应用程序,编写适配器模式类实现代码,实现以上需求的案例,要求编写为控制台应用程序,并能调试运行。

实验(上机)步骤1、本实例类图:OperationAdapter--sortObjsearchObj: QuickSortClass: BinarySearchClass+ + +OperationAdapter ()Sort (int[] array)Search (int[] array, int key) ...: int[]: intScoreOperation+ +Sort (int[] array)Search (int[] array, int key)...: int[]: intQuickSortClass++++QuickSort (int[] array)Sort (int[] array, int p, int r)Partition (int[] a, int p, int r)Swap (int[] a, int i, int j)...: int[]: void: int: voidBinarySearchClass+BinarySearch (int[] array, int key)...: intClient2、创建Adapter的工程,并根据模式的角色创建对应的包。

3、新建ScoreOperation:抽象成绩操作类,充当目标接口p ackage Target;public interface ScoreOperation {// 成绩操作类:用户希望的接口方法// 成绩排序int[] Sort(int[] array);// 成绩查找int Search(int[] array, int key);}4、新建QuickSortClass:快速排序类,充当适配者p ackage Adaptee;public class QuickSortClass {// 快速排序类// 实现对数组的快速排序public int[] QuickSort(int[] array) {Sort(array, 0, array.length - 1);return array;}public void Sort(int[] array, int p, int r) { int q = 0;if (p < r) {q = Partition(array, p, r);Sort(array, p, q - 1);Sort(array, q + 1, r);}}public int Partition(int[] a, int p, int r) { int x = a[r];int j = p - 1;for (int i = p; i <= r - 1; i++) {if (a[i] <= x) {j++;Swap(a, j, i);}}Swap(a, j + 1, r);return j + 1;}public void Swap(int[] a, int i, int j) {int t = a[i];a[i] = a[j];a[j] = t;}}5、新建BinarySearchClass:二分查找类,充当适配者package Adaptee;public class BinarySearchClass {// 二分查找,如果找到,返回1,找不到返回-1// <param name="array">查找的数组</param>// <param name="key">查找的关键字</param>public int BinarySearch(int[] array, int key) { int low = 0;int high = array.length - 1;while (low <= high) {int mid = (low + high) / 2;int midVal = array[mid];if (midVal < key) {low = mid + 1;} else if (midVal > key) {high = mid - 1;} else {return 1; // 找到元素返回1}}return -1; // 未找到元素返回-1}}6、新建OperationAdapter:操作适配器,充当适配器package Adapter;import Adaptee.BinarySearchClass;import Adaptee.QuickSortClass;import Target.ScoreOperation;public class OperationAdapter implements ScoreOperation {// 维护与适配者之间的关联关系private QuickSortClass sortObj; // 定义适配者QuickSortClass对象private BinarySearchClass searchObj; // 定义适配者BinarySearchClass 对象// 构造函数,初始化适配者对象public OperationAdapter() {sortObj = new QuickSortClass();searchObj = new BinarySearchClass();}// 排序方法实现public int[] Sort(int[] array) {return sortObj.QuickSort(array); // 调用适配者类QuickSortClass 的排序方法}// 实现成绩查找方法public int Search(int[] array, int key) {return searchObj.BinarySearch(array, key); // 调用适配者类BinarySearchClass的查找方法}}7、Client:客户端测试类package Test;import Adapter.OperationAdapter;import Target.ScoreOperation;public class Client {public static void main(String[] args) {// 针对抽象目标接口编程ScoreOperation operation = new OperationAdapter();// 定义成绩数组int[] scores = { 84, 76, 50, 69, 90, 91, 88, 96 };int[] result;int score;System.out.println("成绩排序结果:");result = operation.Sort(scores);// 遍历输出成绩for (int i : result) {System.out.println(i + ",");}System.out.println();System.out.println("查找成绩90:");score = operation.Search(result, 90);if (score != -1) {System.out.println("找到成绩90。

");} else {System.out.println("没有找到成绩90。

");}System.out.println("查找成绩92:");score = operation.Search(result, 92);if (score != -1) {System.out.println("找到成绩92。

");} else {System.out.println("没有找到成绩92。

");}}}8、结果及分析结束考核内容1、上交各自建立的电子版解决方案及项目。

2、用EA建模工具编制以上类图。

3、上交实验报告。

相关文档
最新文档