2012年上半年软件设计师之设计模式相关试题及解答

194 篇文章 11 订阅
189 篇文章 394 订阅

       设计模式已成为软件设计师考试试题的一个重要组成部分,每次考试中都会有将近20分左右的设计模式试题,下面我分析一下最近一次软考(2012年5月)的设计模式试题,希望能够给备考软件设计师的童鞋们提供一点帮助,微笑

 

       以下试题都来源于2012年5月软件设计师考试真题。

 

       上午试题:

       ● 面向对象分析与设计中的(37)是指一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的;而(38)是指子类应当可以替换父类并出现在父类能够出现的任何地方。

       (37) A.开闭原则    B.替换原则    C.依赖原则    D.单一职责原则

       (38) A.开闭原则    B.替换原则    C.依赖原则    D.单一职责原则

 

       ● (40)限制了创建类的实例数量,而(41)将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

       (40) A.命令模式(Command)    B.适配器模式(Adapter)    C.策略模式(Strategy)    D.单例模式(Singleton)

       (41) A.命令模式(Command)    B.适配器模式(Adapter)    C.策略模式(Strategy)    D.单例模式(Singleton)

 

       ● (43)设计模式允许一个对象在其内部状态改变时改变它的行为。下图为这种设计模式的类图,已知类 State 为抽象类,则类(44)的实例代表了Context 对象的状态。

                             

       (43) A.单件(Singleton)    B.桥接(Bridge)    C.组合(Composite)    D.状态(State)

       (44) A. Context     B. ConcreteStateA    C. Handle    D. State

 

       试题分析与解答:

       总的来说,这几道题都非常简单,(37)、(38)考查面向对象设计原则,(40)、(41)、(43)、(44)考查设计模式,答案如下:

     (37) A,这是开闭原则的定义。

     (38) B,这是里氏代换原则(替换原则)的定义。

     (40) D,单例模式用于限制类的实例数量。

     (41) B,适配器模式用于将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

     (43) D,状态模式允许一个对象在其内部状态改变时改变它的行为。

     (44) B,具体状态类(例如ConcreteStateA)的实例代表了环境类(Context )对象的状态。

 

      以上几道题在《设计模式实训教程》(刘伟,清华大学出版社,2012年1月)一书中都有原题,第(37)和(38)题参见“第2章 面向对象设计原则实训”选择题第(6)题(第31页),第(40)题参见“第3章 创建型模式实训”选择题第(26)题(第68页),第(41)题参见“第4章 结构型模式实训”选择题第(6)题(第112页),第(43)题和第(44)题参见“第5章 行为型模式实训”选择题第(18)题(第190页)。

 

       下午试题:

           近年来,下午试题的最后一题通常会考查设计模式,由于C++与Java题基本相同,下面以Java版试题为例:

 

      试题六(共15分)
        阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
       【说明】
       某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示:

咖啡

价格/杯()

配料

价格/份()

蒸馏咖啡(Espresso)

25

摩卡(Mocha)

10

深度烘焙咖啡(DarkRoast)

20

奶泡(Whip)

8

       现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。

【Java代码】
import java.util.*;


(1) class Beverage { //饮料
    String description = "Unknown Beverage";
    public (2) () {return description;}
    public (3) ;
}


abstract class CondimentDecorator extends Beverage { //配料
    (4) ;
}


class Espresso extends Beverage { //蒸馏咖啡
    private final int ESPRESSO_PRICE = 25;
    public Espresso() { description="Espresso"; }
    public int cost() { return ESPRESSO_PRICE; }
}


class DarkRoast extends Beverage { //深度烘焙咖啡
    private final int DARKROAST_PRICE = 20;
    public DarkRoast() { description = "DarkRoast"; }
    public int cost() { return DARKROAST PRICE; }
}


class Mocha extends CondimentDecorator { //摩卡
    private final int MOCHA_PRICE = 10;
    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }
    public int cost() {
        return MOCHA_PRICE + beverage.cost();
    }
}


class Whip extends CondimentDecorator { //奶泡
       private final int WHIP_PRICE = 8;
       public Whip(Beverage beverage)
{
           
this.beverage = beverage;
      }
       public String getDescription() {
           return beverage.getDescription() +", Whip";
       }
      public int cost() { return WHIP_PRICE + beverage.cost(); }
}


public class Coffee {
    public static void main(String args[])  {
        Beverage beverage = new DarkRoast();
        beverage=new Mocha( 5 );
        beverage=new Whip ( 6 );
        System.out.println(beverage.getDescription() +"¥" +beverage.cost());
    }
}


       编译运行上述程序,其输出结果为:
       DarkRoast, Mocha, Whip ¥38

 

       本题答案如下:

       (1) abstract
       (2) String getDescription
       (3) abstract int cost()
       (4) Beverage beverage或protected Beverage beverage
       (5) beverage
       (6) beverage
 

      本题在《设计模式实训教程》(刘伟,清华大学出版社,2012年1月)一书中对应题(参见“第6章 模式联用与综合实例实训”之实训练习第15题)如下:

15. There is a coffee shop to server HouseBlend and Espresso coffee. Each coffee can be served with the following condiments: Milk, Mocha. Using Decorator pattern to construct the coffee shop program to compute every beverage’s cost with its description.

abstract class Beverage

{

       public  abstract String getDescription();

       public  abstract double getCost();

}

         Draw the pattern class diagram, and full code (class CondimentDecorator, HouseBlend, Espresso,Milk, Mocha, StarBuzzCoffee and other classes required) to construct the program including a test drive (StarBuzzCoffee class).

【译:有一家咖啡店提供HouseBlend咖啡和Espresso咖啡。每一种咖啡需要用到如下配料:牛奶,摩卡。使用装饰模式构建咖啡店程序,输出其描述并计算每种饮料的花费。

abstract class Beverage

{

       public  abstract String getDescription();

       public  abstract double getCost();

}

        画出模式类图,实现完整的代码(包括类CondimentDecorator,HouseBlend, Espresso, Milk, Mocha, StarBuzzCoffee以及其他所需的类)构建程序,包括一个测试驱动类(StarBuzzCoffee类)。】

 

        试题分析及解答如下:

        本题使用装饰模式设计的类图如下所示:

   在该类图中,Beverage充当抽象组件,HouseBlend和Espresso充当具体组件,CondimentDecorator充当抽象装饰器,Milk和Mocha充当具体装饰器,StarBuzzCoffee充当客户端。本题完整代码示例如下所示:

abstract class Beverage    //抽象组件
{
	public abstract String getDescription();
	public abstract double getCost();
}

class HouseBlend extends Beverage    //具体组件
{
	public String getDescription() 
	{ 
		return "HouseBlend咖啡"; 
	}
	public double getCost() 
	{
		return 10.00; 
	}
}

class Espresso extends Beverage    //具体组件
{
	public String getDescription() 
	{ 
		return "Espresso咖啡"; 
	}
	public double getCost() 
	{
		return 20.00; 
	}
}

class CondimentDecorator extends Beverage    //抽象装饰器
{
	private Beverage beverage;
	public CondimentDecorator(Beverage beverage)
	{
		this.beverage = beverage;
	}
	public String getDescription() 
	{ 
		return beverage.getDescription(); 
	}
	public double getCost() 
	{
		return beverage.getCost(); 
	}
}

class Milk extends CondimentDecorator    //具体装饰器
{
	public Milk(Beverage beverage)
	{
		super(beverage);
	}
	public String getDescription() 
	{ 
		String decription = super.getDescription();
		return decription + "加牛奶"; 
	}
	public double getCost() 
	{
		double cost = super.getCost();
		return cost + 2.0; 
	}
}

class Mocha extends CondimentDecorator    //具体装饰器
{
	public Mocha(Beverage beverage)
	{
		super(beverage);
	}
	public String getDescription() 
	{ 
		String decription = super.getDescription();
		return decription + "加摩卡"; 
	}
	public double getCost() 
	{
		double cost = super.getCost();
		return cost + 3.0; 
	}	
}

class StarBuzzCoffee    //客户端测试类
{
	public static void main(String args[])
	{
		String decription;
		double cost;
		Beverage beverage_e;
		
		beverage_e = new Espresso();
		decription = beverage_e.getDescription();
		cost = beverage_e.getCost();
		System.out.println("饮料:" + decription);
		System.out.println("价格:" + cost);
		System.out.println("---------------------");
		
		Beverage beverage_mi;
		beverage_mi = new Milk(beverage_e);
		decription = beverage_mi.getDescription();
		cost = beverage_mi.getCost();
		System.out.println("饮料:" + decription);
		System.out.println("价格:" + cost);
		System.out.println("---------------------");		

		Beverage beverage_mo;
		beverage_mo = new Mocha(beverage_mi);
		decription = beverage_mo.getDescription();
		cost = beverage_mo.getCost();
		System.out.println("饮料:" + decription);
		System.out.println("价格:" + cost);
		System.out.println("---------------------");		
	}
}
//输出结果如下:
//饮料:Espresso咖啡
//价格:20.0
//---------------------
//饮料:Espresso咖啡加牛奶
//价格:22.0
//---------------------
//饮料:Espresso咖啡加牛奶加摩卡
//价格:25.0

【作者:刘伟 http://blog.csdn.net/lovelion

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
2023上半年软件设计师考试真题尚未发布,因此无法提供具体的真题内容。然而,对于软件设计师考试的准备,有一些常见的考点和技巧可以参考。 考试内容可能包括软件开发流程、系统设计原则、软件需求分析和设计、软件架构和模式、数据库设计与管理、软件测试和质量保证等方面的知识。 考生可通过以下方式准备考试: 1.学习教材和参考书籍:阅读与软件设计相关的教材和参考书籍,理解基本概念、原则和方法。 2.参加培训课程:选择专业机构或在线平台的培训课程,学习和实践软件设计相关技能和工具。 3.解答试题:找到往软件设计师考试试题,进行自测和模拟考试,了解自己的知识掌握程度和应试能力。 4.参考开放资源:搜索互联网上公开的软件设计师考试资料和学习资源,如博客、论坛、知识库等,获取更多实践经验和解题技巧。 5.实践项目经验:参与实际的软件设计项目,锻炼自己的设计能力和解决问题的能力。 在考试前,建议考生进行系统复习,温习重点知识,并进行自测和模拟考试,以熟悉考试形式和增强应试能力。此外,注意间管理,合理安排答题间,避免在一道题上花费过多间而导致其他题目无法完成。 考试过程中,要认真审题,理清题意,有条理地组织答案。在解答问题,可以使用逻辑分析、图表绘制、举例说明等方法,表达清晰、简洁。 总之,在备考软件设计师考试,重点是理解和掌握软件设计的基本概念、原则和方法,结合实际经验和项目实践,灵活运用知识解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值