━ ━ ━ ━ ━ ━ ━ ━ ━ 装 ━ ━ ━ ━ ━ ━ ━ 订 ━ ━ ━ ━ ━ ━ ━ 线 ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━防灾科技学院2013 ~ 2014 学年 第一学期期末考试UML 与设计模式 试卷 (A) 答案及评分细则使用班级1050421/422/423/424、1050411/412 答题时间:120分钟注意事项:1、 考试形式闭卷一、单选题(本大题共5小题,每题 2分,共 10 分,请将答案填写在该题后指定位置) 1、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( )模式。
A 创建型B 结构型C 行为型D 以上都可以2、下面( )图元哪个一个表示关联关系。
AB C D 3、下列模式中,属于行为模式的是( )A.工厂模式 B 观察者模式 C 桥接器模式 D 以上都是4、( )将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
A 代理模式B 适配器模式C 原型模式D 命令模式5、C++中将一个对象赋值给另外一个创建的对象,如下面的代码(注A 代表一个类):A a;A b=a;一定会使用到A 类中什么函数是 ( )。
A. 析构函数 B 拷贝构造函数C. 赋值函数D. 友元函数答案填写处:1 A ;2 B ;3 B ;4 D ;5 B 。
二、填空题(本大题10个空,每空2分,共20分,请将答案填写在该题后指定位置)1、所谓开闭原则具体是指 设计对扩展开放 、____对修改关闭_________。
2的问题。
3、工厂模式分为 简单工厂 、 工厂方法 、 抽象工厂 三种类型。
4、程序设计中追求的两个最基本的原则是 高内聚 、______低耦合_______。
5、C# 编程使用 namespace 关键字表示命名空间,C++中通过 extern 关键字使用其他文件中定义的全局变量。
答案填写处:1 设计对扩展开放、 _对修改关闭 ; 3 简单工厂、工厂方法、抽象工厂 ;4 高内聚、低耦合 ;5 namespace 、extern三、判断题(本大题10个小题,每题1分,共10分,正确的请打√,错误的打×)1、框架是针对某个领域,提供用于开发应用系统的类的集合。
(X )2、一个设计模式有四个基本要素:名称、问题、方案、角色。
(X )模式名称(Pattern Name)问题(Problem)解决方案(Solution)效果(Consequences)3、类A的对象是类B中某个函数的参数,A与B的关系是依赖关系。
(V )4、UML 中图元表示泛化关系。
(V )5、低耦合是指程序中模块与模块间的关联性小。
(V )6、可以使用代理模式实现一个类有且只有一个实例的想法。
单例(X )7、默认情况下,C++ 中使用拷贝构造函数创建对象实质是浅拷贝。
(V )8、一个类的静态函数可以调用类内的非静态函数。
(X )9、面向对象编程,是指设计一个类时,不让该类面向具体的类,而是面向抽象类或接口。
(V )10、接口中的方法访问权限一般为公有。
(V )四、简单题(本大题共5小题,每题4分,共20 分)(定义1分,定义1分,应用场景2分)1、请问什么是桥接模式,桥接模式包含哪些角色、可以应用在哪些场景?定义:将抽象部分与实现部分分离,使得他们都可以独立地变化。
角色:抽象、实现者、具体抽象、具体实现者应用场景:不想让抽象和某些重要的代码是固定的绑定关系;抽象和实现都可以继承的方式独立地扩充而不相互影响;希望实现者层次的代码的修改不影响抽象层。
2、请问什么是代理模式,代理模式包含哪些角色、可以应用在哪些场景?定义:为其他对象提供一种代理以控制对这个对象的访问。
角色:抽象主题、实际主题、代理。
应用场景:程序可能不希望用户直接访问实际对象,而是通过一个特殊的对象以控制对当前对象的访问;如果一个对象需要很长时间才能加载完成;如果对象位于远程主机上,需要为用户提供访问远程对象的能力。
3、请问什么是装饰模式,装饰模式包含哪些角色、可以应用在哪些场景?定义:动态地给对象添加一些额外的职责。
角色:抽象组件、具体组件、装饰、具体装饰。
场景:程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象;采用继承来增强对象功能不利于系统的扩展和维护。
4、请问什么是原型模式,原型模式包含哪些角色、可以应用在哪些场景?定义:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
角色:抽象原型;具体原型。
场景:程序需要从一个对象出发,得到若干个和其他状态相同,并且可以独立变化其状态的对象;对象的创建可以与对象的构建独立。
5、请问什么是责任链器模式,责任链模式包含哪些角色、可以应用在哪些场景?定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
角色:处理者、具体处理者。
场景:有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象;希望用户不必明确指定接受者的情况下,向多个接受者一个提交请求;程序希望动态指定可处理用户请求的对象集合。
五、程序设计题(本大题共4个小题,每个题目10共40分)1、现有一公司有3部门组成,每个部门有10名员工,现需要统计一个部门的人员工资总和和每名员工的工资,要求使用组合模式设计程序实现。
(10分)抽象组件(该部分3分,每处错误扣1分)import java.util.*;public interface Person{public void add(Person person) throws NoSuchMethodException;public void remove(Person person) throws NoSuchMethodException;public MilitaryPerson getChild(int index) throws NoSuchMethodException;public Iterator<Person> getAllChildren() throws NoSuchMethodException;public boolean isLeaf();public double getSalary();public void setSalary(double salary);public String toString();}Composite 节点(该部分4分,每处错误扣1分)public class Officer implements Person{LinkedList<Person> list;String name;double salary;Officer(String name,double salary){=name;this.salary=salary;list=new LinkedList<Person>();}public void add(Person person) {list.add(person);}public void remove(Person person){list.remove(person);}public Person getChild(int index) {return list.get(index);}public Iterator<Person> getAllChildren() {return list.iterator();}public boolean isLeaf(){return false;}public double getSalary(){return salary;}public void setSalary(double salary){this.salary=salary;}}叶子节点(该部分3分,每处错误扣1分)public class staff implements Person{double salary;String name;staff(String name,double salary){=name;this.salary=salary;public void add(Person person) {}public void remove (Person person){}public Person getChild(int index) {return null;}public Iterator<Person> getAllChildren() {return null;}public boolean isLeaf(){return true;}public double getSalary(){return salary;}public void setSalary(double salary){this.salary=salary;}}2、现有一字符串链表(LinkedList),装有1000个字符串(内容自拟),要求使用迭代器模式设计程序对链表的中的元素进行遍历并打印输出。
(10分)import java.util.*;public class TestSpeed{public static void main(String args[]){LinkedList<String> list=new LinkedList<String>(); (2分)for(int i=0;i<=1000;i++){list.add("speed"+i);}Iterator<String> iter=list.iterator(); (2分)long starttime=System.currentTimeMillis();while(iter.hasNext()){ (2分)String te=iter.next(); (1分)}long endTime=System.currentTimeMillis();long result=endTime-starttime;System.out.println("使用迭代器遍历集合所用时间:"+result+"毫秒");starttime=System.currentTimeMillis();for(int i=0;i<list.size();i++){ (1分)String te=list.get(i); (1分)System.out.println(te); (1分)}endTime=System.currentTimeMillis();result=endTime-starttime;System.out.println("使用get方法遍历集合所用时间:"+result+"毫秒");}}3、现有一个字符串数组,现需要:统计数组的长度,按照字符串的长度大小对数组进行排序,最后将排序号后的字符串数组输出。