编程中常见的技术难题有哪些?
2010年系统架构设计师考试在2009年的基础上增加了一道设计模式考题,Sunny友情建议微笑:大家可以先做做这些试题,看是否能够正确解答,如果在解答的同时还能够拿出具体的设计和实现方案,我相信一定会受益匪浅!奋斗,试题分析和参考答案为Sunny个人所作,可能跟某些已发布的"标准答案"会有所不同,如有不同意见,欢迎与我交流!【说明:为了体现试题的真实性,每一道试题的题号均保留原始真题题号】
真题如下:
【全国计算机技术与软件专业技术资格(水平)考试 2010年下半年 系统架构设计师 上午试卷】
某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method中的"Creator"角色相对应的类是 (33) ;与"Product"角色相对应的类是 (34) 。
(33) A. Bank B. Account C. Checking D. Savings
(34) A. Bank B. Account C. Checking D. Savings
某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转发给其他查询环境。基于上述需求,采用 (59) 最为合适。
(59) A. 责任链模式 B. 桥接模式 C. 装饰模式 D. 适配器模式
某公司欲开发一套窗体图形界面类库。该类库需要包含若干预定义的窗格(Pane)对象,例如TextPane、ListPane等,窗格之间不允许直接引用。基于该类库的应用由一个包含一组窗格的窗口组成,并需要协调窗格之间的行为。基于该类库,在不引用窗格的前提下实现窗格之间的协作,应用开发者应采用 (60) 最为合适。
(60) A.备忘录模式 B. 中介者模式 C. 访问者模式 D. 迭代器模式
某公司开发一个文档编辑器,该编辑器允许在文档中直接嵌入图形对象,但开销很大。用户在系统设计之初提出编辑器在打开文档时必须十分迅速,可以暂时不显示当前页面以外的图形。针对这种需求,公司可以采用 (61) 避免同时创建这些图形对象。
(61) A. 代理模式 B. 外观模式 C. 桥接模式 D. 组合模式
答案
试题分析与解答:
(33) - (34) 本题更像是简单工厂(Simple Factory)模式的一个应用实例,而不是工厂方法(Factory Method)模式(因为没有工厂等级结构,只有产品等级结构,当然题目中也没有明确说用的是哪个模式,微笑)。在简单工厂模式中提供了一个工厂类,在工厂类的工厂方法中可以根据参数不同来创建不同的产品对象(在此题中,工厂方法没有参数,尴尬,所以也不是严格意义上的简单工厂模式,但与简单工厂模式最为接近),由于在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。在简单工厂模式结构中,包含3个角色,分别是:Factory或Creator(工厂角色)、Product(抽象产品角色)和ConcreteProduct(具体产品角色)。
在图中,我们不难分析出:
Bank类充当工厂角色(Factory/Creator);
抽象类Account充当抽象产品角色(Product);
Checking和Savings充当具体产品角色(ConcreteProduct)。
参考答案:A, B
(59) 根据题干,要求开发一个软件的在线文档帮助系统,用户可以在任何一个查询上下文(查询环境)中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转发给其他查询环境。透过题干,不难发现,该系统将提供多个查询环境,而且这些查询环境可以通过某种方式联系在一起,当一个查询环境不能处理请求时,将查询关键字转发给下一个查询环境。针对这一需求,我们可以选择职责链模式(Chain of Responsibility Pattern)进行设计。通过职责链模式,可避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。在《设计模式实训教程》一书中Sunny给出了此题完整的设计方案和代码模拟实现,参考类图如下:
关于职责链模式的详细讲解,大家可以参考:请求的链式处理------职责链模式。
参考答案:A
(60) 根据题干,要求该窗体图形界面类库的应用中的多个窗格之间不允许直接引用(Sunny觉得原题中"在不引用窗格的前提下实现窗格之间的协作"改为"在窗格之间不发生直接引用的前提下实现窗格之间的协作"更合理,偷笑),根据迪米特法则,可以通过引入一个"第三者"来协调窗格之间的交互行为。因此,可以选择中介者模式(Mediator Pattern)进行设计。中介者模式通过引入一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在《设计模式实训教程》一书中Sunny给出了此题完整的设计方案和代码模拟实现,参考类图如下:
关于中介者模式的详细讲解,大家可以参考:协调多个对象之间的交互------中介者模式。
参考答案:B
(61) 根据题干,该编辑器为了在打开文档时提高速度,可以暂时不显示当前页面以外的图形,这些图形可以使用一个占位符来代替,如果系统考虑得更完善的话,可以结合多线程来实现,一个线程显示当前页面的内容,另一个线程加载下一个(些)页面的内容。针对这一需求,可以使用代理模式(Proxy Pattern)来实现,在代理模式中,给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在代理模式中引入了一个新的代理对象,代理对象可以在客户端对象和目标对象之间起到中介的作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。代理模式的类型较多,包括远程代理、缓冲代理、虚拟代理、保护代理等等,此处可以使用虚拟代理,虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销或者缩短数据的加载时间。关于代理模式的更多介绍,大家可以参考:代理模式(文章虽然是使用C#语言来讲解的,但所有语言中代理模式的基本原理和思想是一致的)。学习之余,建议大家使用虚拟代理来为本题提供一套设计方案。
参考答案:A