当前位置:文档之家› 3.2 适配器模式

3.2 适配器模式

6.适配器模式-组合模式

10. 适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。绘制类图并编程实现。(要求实现快速排序和二分查找) interface DataOperation{ ---; ---; } class QuickSort{ public int[] quickSort(int[] num){ return sort(num,0,num.length-1); } private int[] sort(int[] num,int left,int right){ if(left < right){ //将第一个数作为参照轴 int s = num[left]; int i = left; int j = right+1; while(true){ //从左向右找,直到找到比S大的数 while(i+1-1 && num[--j]>s);

//此时如果i>=j,则说明已交叉,跳出该永久循环 if(i >= j){ break; } //否则如果i<=j,则交换下标为i和下标为j的两元素的值 swap(num,i,j); } //把比S小的数放到下标为left处 num[left] = num[j]; //最后将轴S置于比它小和比它大的两组数之间 num[j] = s; //对S的左右两侧分别再次使用快速排序 sort(num,left,j-1); sort(num,j+1,right); } return num; } private void swap(int[] num,int i,int j){ int t; t = num[i]; num[i] = num[j]; num[j] = t; } } class BinarySearch{ public int binarySearch(int[] num,int x){ int low = 0; int high = num.length - 1; while(low <= high){ //此时抛出ArrayIndexOutOfBoundsException 异常.. int mid = low + (high - low)/2; int midVal = num[mid]; if(x > midVal){ low = mid + 1; }else if (x < midVal){ high = mid - 1; }else{ return mid; } } return -1; //没找到元素x }

设计模式试题(仅供参考)

1、设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2、下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是 3、Open-Close原则的含义是一个软件实体( a ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对 4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。 A.创建型 B.结构型 C行为型 D.以上都可以 5、要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程,是( d )的表述 A.开-闭原则 B.接口隔离原则 C.里氏代换原则 D.依赖倒转原则 6、依据设计模式思想,程序开发中应优先使用的是( a )关系实现复用。 A, 委派 B.继承 C创建 D.以上都不对 复用方式:继承和组合聚合(组合委派) 7、设计模式的两大主题是( d ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 8、单例模式中,两个基本要点( a b )和单子类自己提供单例 A .构造函数私有 B.唯一实例 C.静态工厂方法 D.以上都不对 9、下列模式中,属于行为模式的是( b ) A.工厂模式 B观察者 C适配器以上都是 10、“不要和陌生人说话” 是( d )原则的通俗表述 A.接口隔离 B.里氏代换 C.依赖倒转 D.迪米特:一个对象应对其他对象尽可能少的了解 11、构造者的的退化模式是通过合并( c )角色完成退化的。 A.抽象产品 B产品 C创建者 D使用者 12、单子(单例,单态)模式类图结构如下: 下列论述中,关于”0..1”表述的不正确的是( d ) A.1表示,一个单例类中,最多可以有一个实例. B.”0..1”表示单例类中有不多于一个的实例 C.0表示单例类中可以没有任何实例 D.0表示单例类可以提供其他非自身的实例 13、对象适配器模式是( a )原则的典型应用。 A.合成聚合复用原则 B.里式代换原则 C.依赖倒转原则 D.迪米特法则 14、静态工厂的核心角色是(a) A.抽象产品 B.具体产品 C.静态工厂 D.消费者 15、下列关于静态工厂与工厂方法表述错误的是:( a ) A.两者都满足开闭原则:静态工厂以if else方式创建对象,增加需求的时候会修改源代码 B.静态工厂对具体产品的创建类别和创建时机的判断是混和在一起的,这点在工厂

23种模式详解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 二、设计模式的六大原则 1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。 5、迪米特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、合成复用原则(Composite Reuse Principle) 原则是尽量使用合成/聚合的方式,而不是使用继承。 三、Java的23中设计模式 从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。 1、工厂方法模式(Factory Method) 工厂方法模式分为三种:

深入浅出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),与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。

适配器模式

学号: 系统分析与设计 实验报告 实验题目:实验三适配器模式 学生姓名: 学院:信息数理学院专业班级: 指导教师: 时间: 2018 年 5 月 11 日

OperationAdapter --sortObj searchObj : QuickSortClass : BinarySearchClass +++OperationAdapter ()Sort (int[] array)Search (int[] array, int key)... : int[]: int ScoreOperation ++Sort (int[] array)Search (int[] array, int key)... : int[]: int QuickSortClass ++++ 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 : void BinarySearchClass +BinarySearch (int[] array, int key)... : int Client 【实验目的】 掌握适配器模式的定义、结构及实现方式。 【实验内容】 在为某学校开发教务管理系统时,开发人员发现需要对学生成绩进行排序和查找,该系统的设计人员已经开发了一个成绩操作接口ScoreOperation ,在该接口中声明了排序方法Sort(int[]) 和查找方法Search(int[], int),为了提高排序和查找的效率,开发人员决定重用现有算法库中的快速排序算法类QuickSortClass 和二分查找算法类BinarySearchClass ,其中QuickSortClass 的QuickSort(int[])方法实现了快速排序,BinarySearchClass 的BinarySearch (int[], int)方法实现了二分查找。 由于某些原因,开发人员已经找不到该算法库的源代码,无法直接通过复制和粘贴操作来重用其中的代码;而且部分开发人员已经针对ScoreOperation 接口编程,如果再要求对该接口进行修改或要求大家直接使用QuickSortClass 类和BinarySearchClass 类将导致大量代码需要修改。 现使用适配器模式设计一个系统,在不修改已有代码的前提下将类QuickSortClass 和类BinarySearchClass 的相关方法适配到ScoreOperation 接口中。 REF 适配器模式包含以下3个角色: Target (目标抽象类) Adapter (适配器类) Adaptee (适配者类) //ScoreOperation.cs using System;

软件设计模式(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接口中。 新建解决方案,新建一个控制台应用程序,编写适配器模式类实现代码,实现以上需求的案例,要求编写为控制台应用程序,并能调试运行。 实验(上机)步骤 1、本实例类图:

设计模式复习题

三、题目预测 填空题: 1.请从外观、组合、工厂方法、模板方法、观察者、单件、抽象工厂、命令、迭代器、代理、适配器模式中选择7种填入下列的空缺中。P610 1) 工厂方法模式中,父类负责定义创建对象的公共接口,子类决定要创建的具体类是哪一个。 2) 抽象工厂模式提供一系列相关或相互依赖对象的接口而无需指定它们具体的类。 3) 单件模式确保某一个类仅有一个实例,并自行实例化并向整个系统提供这个实例。 4) 组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。 5) 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,为子系统中的一组接口提供一个一致的界面,简化了一群类的接口。 6) 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新,也就是让对象能在状态改变时被通知。 7) 模板模MVC模型式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 8) 迭代器模式在对象的集合之中游走,而不暴露集合的实现。 9) 代理模式包装对象,以控制对比对象的访问。 10) 适配器模式封装对象,并提供不同的接口。 2.工厂模式分为(简单工厂),(工厂方法),(抽象工厂)三种类型。 3.适配器模式,分为类的适配器和对象的适配器两种实现。其中类的适配器采用的是(继承)关系,而对象适配器采用的是(组合聚合)关系。 4.设计模式的基本要素有(名字),(意图),(问题),(解决方案),(参与者与协作者),(实现),(一般性结构)。 5.MVC模型的基本工作原理是基于(观察者)模式,实现是基于(命令)模式 6.面向对象的六条基本原则包括:开闭原则,里式代换原则,合成聚合原则以及(依赖倒转),(迪米特法则)(接口隔离)。 7.当我们想用不同的请求对客户进行参数化时,可以使用(命令)模式。

软件体系结构期末考试试题

软件体系结构-设计模式练习题1 1.面向对象分析与设计中的(1)是指一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的;而(2)是指子类应当可以替换父类并出现在父类能够出现的任何地方。 (1) A.开闭原则 B.替换原则 C.依赖原则 D.单一职责原则 (2) A.开闭原则 B.替换原则 C.依赖原则 D.单一职责原则 2.(3)限制了创建类的实例数量,而(4)将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 (3) A.命令模式(Command)B.适配器模式(Adapter)C.策略模式(Strategy) D.单例模式(Singleton) (4) A.命令模式(Command) B.适配器模式(Adapter) C.策略模式(Strategy) D.单例模式(Singleton) 3. (5)设计模式允许一个对象在其内部状态改变时改变它的行为。下图为这种设计模式的类图,已知类State 为抽象类,则类(6)的实例代表了Context 对象的状态。 (5) A.单件(Singleton) B.桥接(Bridge) C.组合(Composite) D.状态(State) (6) A. Context B. ConcreteStateA C. Handle D. State

4.某公司欲开发一门户网站,将公司的各个分公司及办事处信息进行整合。现决定采用Composite设计模式来实现公司的组织结构关系,并设计了如下图所示的UML类图。图中与Composite模式中的“Component”角色相对应的类是(7) ,与“Composite”角色相对应的类是(8) 。 (7) A. Company B. FinanceDepartment C. HRDepartment D. ConcreteCompany (8) A. Company B. FinanceDepartment C. HRDepartment D. ConcreteCompany 5.某软件公司正在设计一个通用的嵌入式数据处理平台,需要支持多种数据处理芯片之间的数据传递与交换。该平台的核心功能之一要求能够屏蔽芯片之间的数据交互,使其耦合松散,并且可以独立改变芯片之间的交互过程。针对上述需求,采用(9)最为合适。 (9) A. 抽象工厂模式 B. 策略模式 C. 中介者模式D. 状态模式 6.某软件公司正在设计一个图像处理软件,该软件需要支持用户在图像处理中的撤销和重做等动作,为了实现该功能,采用(10)最为合适。 (10) A. 单例模式B. 命令模式 C. 访问者模式 D. 适配器模式 7.某互联网公司正在设计一套网络聊天系统,为了限制用户在使用该系统时发表不恰当言论,需要对聊天内容进行特定敏感词的过滤。针对上述功能需求,采用(11)能够灵活配置敏感 词的过滤过程。 (11) A. 责任链模式 B. 工厂模式 C. 组合模式 D. 装饰模式

适配器模式

适配器:基于现有类所提供的服务,向客户提供接口,以满足客户的期望 《Java设计模式》 类适配器 客户的开发人员定义了一个接口,期望用这个接口来完成整数的求和操作,接口定义如下: Java代码 1.public interface Operation{ 2. public int add(int a,int b); 3.} 开发人员在了解这个接口的定义后,发现一个第三方类,里面有一个方法能实现他们期望的功能,其代码如下: Java代码 1.public class OtherOperation{ 2. public int otherAdd(int a,int b){ 3. return a + b; 4. } 5.} 以上第三方类OtherOperation的方法public int otherAdd(int a,int b)所提供的功能,完全能符合客户的期望,所以只需要想办法把OtherOperation的otherAdd(int a,int b)和客户的Operation接口联系起来,让这个第三方类来为客户提供他们期望的服务就行了,这样就避免了开发人员再度去研究类似OtherOperation的otherAdd(int a,int b)方法的实现(利用已有的轮子,避免重复发明),这方法之一,就是用适配器模式: Java代码 1.public class AdapterOperation extends OtherOperation implements Operation{ 2. public int add(int a,int b){ 3. return otherAdd(a,b); 4. } 5.} 以上就是适配器的实现方法之一,类适配器,在以上实现中存在着三中角色分别是:

适配器模式的本质及分类

适配器模式的本质及分类 什么是适配器在计算机编程中,适配器模式(有时候也称包装样式或者包装)把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。 适配器模式所涉及的角色有: ●目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。 ●源(Adapee)角色:现在需要适配的接口。 ●适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。 适配器模式的本质适配器模式的本质是:转换匹配,复用功能。 适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配是手段,而复用已有的功能才是目的。 在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。 适配器的分类共有两类适配器模式: 类适配器模式-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。 1. 用一个具体的Adapter类对Adaptee和Taget进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。 2. 使得Adapter可以override(重定义)Adaptee的部分行为,因为Adapter是Adaptee 的一个子类。 对象适配器模式-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

常见23种模式概述

常见23种模式概述: 1)抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 2)适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。 3)桥梁模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。 4)建造模式(Builder):将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。 5)责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 6)命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。 7)合成模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 8)装饰模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,它能生成子类的方式更为灵活。 9)门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 10)工厂方法(Factory Method):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method 使一个类的实例化延迟到其子类。 11)享元模式(Flyweight):运用共享技术以有效地支持大量细粒度的对象。 12)解释器模式(Interpreter):给定一个语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。 13)迭代子模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。 14)调停者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的内部表示。 15)备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并

实验4-适配器组合外观模式.方案资料讲解

实验报告 系别班级学号姓名时间地点 20160418 课程名称设计模式实验名称适配器、组合、外观 实验过程 一.实验目的与要求 熟练使用适配器、组合、外观模式 二.实验设备 微型计算机 三.实验原理和实验内容 1.实验原理: 2.实验内容: 1)某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随 着灯光闪烁和声音提示,在该公司以往的产品中已经实现了控制灯光闪烁和声音提示的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性,使用适配器模式设计该系统,所得类图如下图所示。编程模式实现程序。 2)某公司的组织结构采用组合设计模式来设计,得到类图如下。其中Company为抽象类,定义了在组织结

构上添加(Add)和删除(Delete)部门的方法接口。类ConcreteCompany表示具体的公司,可以设置不同的部门。 类HRDepartment和类FianceDepartment分别表示人力资源部和财务部。编程模拟实现。 3)某信息系统需要提供一个数据读取和报表显示模块,可以将来自不同类型文件中的数据转换成XML格式,并对数 据进行统计和分析,然后以报表方式来显示数据。由于该过程需要涉及多个类,因此使用外观模式进行设计,编程模拟实现程序。FileOperation类用于读取文件,XMLDataConvertor类用于将不同格式文件转换为XML格式,DataAnalysis用于对XML数据进行统计分析,ReportDisplay类用于显示报表。为了让系统具有更好的扩展性,在系统设计中引入了抽象外观类AbstractFacade,它拥有多个不同的子类,如XMLFacade,它用于与读取、分析和显示XML数据的类交互,ExtendedFacade类用于与读取、转换、分析和显示非XML数据的类交互。 3.实验结果

java适配器模式

Java适配器模式 问题引出:大家生活中可能碰到的一个问题就是你新买的手机自带的耳机是2.5接口的,不幸的是有一天你的耳机坏了,你去市面上根本就找不到2.5的耳机了,基本上是3.5接口了,没办法你只好买了个3.5接口的耳机,老板告诉你:“我给你一个适配器”这不问题就解决了。 问题分析:3.5的接口的耳机在你手机上本来是没法使用的,因为它没有按照2.5接口的设计啊,而现在我又想使用这幅耳机,于是乎有了“适配器(Adapter)”这个一个东西出来了。 Adapter模式的定义:把一个类的接口变换成客户端所期待的另外一种接口,使得原本由于接口不兼容而不能再一起工作的那些类可以一起工作。 适配器模式分类:1.类的适配器模式(采用继承实现)2.对象适配器(采用对象组合方式实现) 类的适配器类图: 模式的构成:以问题中例子为模型 目标抽象角色(Target):定义客户所期待要使用的接口,我们把手机当做客户端,客户端所需要使用的耳机的接口是2.5的,在这里就可以抽象出来一个2.5接口的设备(并不一定是耳机)。

源角色(Adaptee):需要被适配的接口,在这里指的是我们从市场上买回来的那个3.5接口的耳机。 适配器角色(Adapter):用来把源接口转换成符合要求的目标接口的设备,在这里指的是老板送给我们的那个“转换器”。 客户端(Client):这里指的就是那个给我们带来麻烦的手机喽。 示例代码: Java代码 1.//Target 2. 3.package pattern.adapter; 4. 5.public interface Target { 6. 7. public void provide2_5(); 8. 9.} 10. 11.//Adaptee 12. 13.package pattern.adapter; 14. 15.public class Adaptee { 16. 17. public void provide3_5(){ 18. 19. System.out.println("我是一个3.5的接口哦"); 20. 21. } 22. 23.} 24. 25.//Adapter 26. 27.package pattern.adapter; 28. 29.public class Adapter extends Adaptee implements Target { 30. 31. @Override 32.

适配器模式(adapter)C++实现

适配器模式(adapter) 意图:将一个类的接口转换成客户希望的另一个接口。 适用性:1.你想使用一个已存在的类,而它的接口不符合你的需求。 2.你想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类协同工作。 类适配器结构: 类适配器效果:1.仅仅引入一个对象,并不需要额外的指针以间接得到adaptee。 2.当我们想要匹配一个类以及它所有的子类时,类适配器将无法完成。 3.使得Adapter可以重新定义Adaptee的部分行为。 类适配器代码: #ifndef _ADAPTER_ #define _ADAPTER_ #include using namespace std; class Target{ public: Target(){} virtual void JulySeven() {

cout<<"中国人过情人节\n"; } }; class Adaptee{ public: Adaptee(){} virtual void March14th() { cout<<"美国人过情人节\n"; } }; class AdapterClass: public Target, public Adaptee{ public: AdapterClass(){} public: virtual void JulySeven() { March14th(); } }; #endif 中国在七月七日过情人节,美国在三月十四过情人节。 现在要实现七月七日美国人过情人节: #include #include "Adapter.h" using namespace std; int main() { Target* target = new Target; cout<<"7月7日"; target->JulySeven(); //类适配器 target = new AdapterClass;

适配器模式

本文讨论适配器模式。适配器模式是23中设计模式之一,它的主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。为了举这个例子,我还特意去京东上搜了一下电源转换器,确实看到了很多地方的标准不一样。我们国家的电器使用普通的扁平两项或三项插头,而去外国的话,使用的标准就不一样了,比如德国,使用的是德国标准,是两项圆头的插头。如果去德国旅游,那么我们使用的手机充电器插头无法插到德国的插排中去,那就意味着我们无法给手机充电。怎样解决这个问题呢?只要使用一个电源转化器就行了。如下图所 示: 该适配器下面的插头符合德国标准,可以插到德国的插排中去,上面提供的接口符合国标,可以供我们的手机充电器使用。 实现电源适配器 下面我们使用代码来表述适配器模式:

代码中有两个接口,分别为德标接口和国标接口,分别命名为DBSocketInterface和GBSocketInterface,此外还有两个实现类,分别为德国插座和中国插座,分别为DBSocket和GBSocket。为了提供两套接口之间的适配,我们提供了一个适配器,叫做SocketAdapter。除此之外,还有一个客户端,比如是我们去德国旅游时住的一家宾馆,叫Hotel,在这个德国旅馆中使用德国接口。 德标接口: 1 2 3 4 5 6 7 8 9 10 11 /** * 德标接口 */ public interface DBSocketInterface { /** * 这个方法的名字叫做:使用两项圆头的插口供电 * 本人英语就这个水平 */ void powerWithTwoRound(); } 德国插座实现德标接口 1 2 3 4 5 6 7 /** * 德国插座 */ public class DBSocket implements DBSocketInterface{ public void powerWithTwoRound(){ System.out.println("使用两项圆头的插孔供电");

软件体系结构与设计模式期末复习

体系结构期末复习 一、选择题 (一) 1. 设计模式的基本原理是( C ) A.面向实现编程 B.面向对象编程 C.面向接口编程 D.面向组合编程 2. 设计模式的两大主题是( D ) A.系统的维护与开发 B.对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 3. 依据设计模式思想,程序开发中应优先使用的是( A )关系实现复用。 A.组合聚合 B.继承 C.创建 D..以上都不对 4. 关于继承表述错误的是( D ) A.继承是一种通过扩展一个已有对象的实现,从而获得新功能的复用方法。 B.泛化类(超类)可以显式地捕获那些公共的属性和方法。特殊类(子类)则通过 附加属性和方法来进行实现的扩展。 C.破坏了封装性,因为这会将父类的实现细节暴露给子类。 D.继承本质上是“白盒复用”,对父类的修改,不会影响到子类。 5. 常用的设计模式可分为( A ) A.创建型、结构型和行为型 B.对象型、结构型和行为型 C.过程型、创建型和结构型 D.抽象型、接口型和实现型 6. “不要和陌生人说话”是对( D )设计原则的通俗表述。 A.接口隔离 B.里氏代换 C.依赖倒转 D..迪米特法则 7. 在适配器模式中,对象适配器模式是对( A )设计原则的典型应用 A.合成聚合 B.里氏代换 C.依赖倒转 D..迪米特法则 8. 将一个类的接口转换成客户希望的另一个接口,这句话是对(C)设计模式的描述 A.策略模式 B.桥接模式 C.适配器模式 D.单例模式 9. 以下设计模式中属于结构模式的是( D ) A. 观察者模式 B.单例模式 C.策略模式 D.外观模式 10. 以下不属于对象行为型模式是( D ) A. 命令模式 B.策略模式 C.访问者模式 D.桥接模式 11. 下面的类图表示的是哪个设计模式( D ) A. 抽象工厂模式 B.观察者模式 C.策略模式 D.桥接模式

设计模式习题

设计模式习题 1、设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是 2、下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是 3、Open-Close原则的含义是一个软件实体( a ) A.应当对扩展开放,对修改关闭. B.应当对修改开放,对扩展关闭 C.应当对继承开放,对修改关闭 D.以上都不对 4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。 A.创建型 B.结构型 C行为型 D.以上都可以 5、要依赖于抽象,不要依赖于具体。即针对接口编程,不要针对实现编程,是( d )的表述 A.开-闭原则 B.接口隔离原则 C.里氏代换原则 D.依赖倒转原则 6、依据设计模式思想,程序开发中应优先使用的是( a )关系实现复用。 A,委派 B.继承 C创建 D.以上都不对 复用方式:继承和组合聚合(组合委派) 7、设计模式的两大主题是( d ) A.系统的维护与开发 B 对象组合与类的继承 C.系统架构与系统开发 D.系统复用与系统扩展 8、单子模式中,两个基本要点( a b )和单子类自己提供单例 A.构造函数私有 B.唯一实例 C.静态工厂方法 D.以上都不对 9、下列模式中,属于行为模式的是( b ) A.工厂模式 B观察者 C适配器以上都是 10、“不要和陌生人说话” 是( d )原则的通俗表述 A.接口隔离 B.里氏代换 C.依赖倒转 D.迪米特:一个对象应对其他对象

尽可能少的了解 11、构造者的的退化模式是通过合并( c )角色完成退化的。 A.抽象产品 B产品 C创建者 D使用者 12、单子(单例,单态)模式类图结构如下: 下列论述中,关于”0..1”表述的不正确的是( d ) A.1表示,一个单例类中,最多可以有一个实例. B.”0..1”表示单例类中有不多于一个的实例 C.0表示单例类中可以没有任何实例 D.0表示单例类可以提供其他非自身的实例 13、对象适配器模式是( a )原则的典型应用。 A.合成聚合复用原则 B.里式代换原则 C.依赖倒转原则 D.迪米特法则 14、静态工厂的核心角色是(a) A.抽象产品 B.具体产品 C.静态工厂 D.消费者 15、下列关于静态工厂与工厂方法表述错误的是:( a ) A.两者都满足开闭原则:静态工厂以if else方式创建对象,增加需求的时候会修改源代码 B.静态工厂对具体产品的创建类别和创建时机的判断是混和在一起的,这点在工厂方法中 C.不能形成静态工厂的继承结构 D.在工厂方法模式中,对于存在继承等级结构的产品树,产品的创建是通过相应等级结构的工厂创建的。 16、在观察者模式中,表述错误的是( c ) A.观察者角色的更新是被动的。 B.被观察者可以通知观察者进行更新 C.观察者可以改变被观察者的状态,再由被观察者通知所有观察者依据被观察者的状态进行。 D.以上表述全部错误。 17.对于违反里式代换原则的两个类,可以采用的候选解决方案错误的是:( d ) A.创建一个新的抽象类C,作为两个具体类的超类,将A 和B 共同的行为移动到C 中,从而解决A和B 行为不完全一致的问题。 B.将B到A的继承关系改组成委派关系。 C.区分是“IS-a”还是”Has-a”。如果是“Is-a”,可以使用继承关系,如果是”Has-a”应该改成委派关系 D.以上方案错误

设计模式题库

1.1 (D)以用户的观点表示系统的目标,它是所有视图的核心,该视图描述系统的需求。 A 结构视图 B 行为视图 C 实现视图 D 用户视图 E 环境视图 F 物理视图G逻辑视图 1.2 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同(ABC)的对象集合的总称。 A 属性 B 操作 C 关系 D 约束 E 继承 F 多态 G 封装 2.1 面向对象设计原则首先都是(B)的原则,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。 A 重载 B 复用 C 面向对象 D 封装 E 继承 F 多态G抽象 2.2以下说法错误的有(BDH) A 对于面向对象的软件系统设计来说,在支持可维护性的同时,需要提高系统的可复用性。 B 迪米特法则要求一个软件实体应当尽可能多的与其他实体发生相互作用。 C 单一职责原则要求在软件系统中,一个类只负责一个功能领域中的相应职责。 D 开闭原则要求一个软件实体应当对扩展开放,对修改关闭,但是为了增强系统功能,可 以随便的修改源代码。 E 里氏代换原则可以通俗表述为在软件中如果能够使用基类对象,那么一定能够使用其子 类对象。 F 依赖倒转原则要求抽象不应该依赖于细节,细节应该依赖于抽象;要针对接口编程,不 要针对实现编程。 G 接口隔离原则要求客户端不应该依赖那些它不需要的接口,即将一些大的接口细化成一 些小的接口供客户端使用。 H 合成复用原则要求复用时尽量使用继承,而不使用对象组合。 3.1 结构型模式分为类模式和对象模式,以下可以是类模式的是(A) A 适配器模式 B 桥接模式 C 组合模式 D 装饰模式 E 外观模式 F 享元模式 G 代理模式 3.2 设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面(ABDE) A 模式名称 B 问题 C 目的 D 解决方案 E 效果 F 实例代码 G 相关设计模式 4.1 以下关于简单工厂模式叙述错误的是(A) A 它属于GoF23种设计模式 B 它是最简单的设计模式之一 C 它是学习其他创建型模式的基础 D 它只需要记住一个简单的参数即可获得所需对象的实例 E 它类中的方法通常为静态方法 F 它返回的类都有一个公共的父类和公共的方法 4.2 简单工厂模式包含三个角色是(ABC) A 工厂角色 B 抽象产品口 C 具体产品角色 D 抽象接口角色 E 生产者角色 F 用户角色 G 使用者角色 5.1 Java中的(A)是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、超类等信息,还包括实例的创建和实例类型的判断等 A 反射 B 继承 C 多态 D 组合 E 聚合 F 抽象 G 抽象 5.2 工厂方法模式与简单工厂模式相比的优点有(ABCD) A 工厂方法模式很好的符合开闭原则 B 工厂方法类模式中工厂类职责变轻,业务逻辑相对简单

相关主题
文本预览
相关文档 最新文档