
1.以下关于构造函数的说法,其中错误的是( B )
A.构造函数的函数名必须与类名相同
B.构造函数可以指定返回类型
C.构造函数可以带有参数
D.构造函数可以重载
2.类的构造函数是在( B )调用的。
A. 类创建时 B. 创建对象时
C. 删除对象时 D. 不自动调用
3.在以下关于方法重载的说法,其中错误的是( D )
A.方法可以通过指定不同的返回值类型实现重载
B.方法可以通过指定不同的参数个数实现重载
C.方法可以通过指定不同的参数类型实现重载
D.方法可以通过指定不同的参数顺序实现重载
4.在定义类时,如果希望类的某个方法能够在派生类中进一步进行改进,以处理不同的派生类的需要,则应该将该方法声明为 ( D )
A.sealed B.public C.virtual D.override
5.( D )表示了对象间的is-a的关系。
A. 组合 B. 引用 C. 聚合 D. 继承
6.关于单一职责原则,以下叙述错误的是( C )。
A. 一个类只负责一个功能领域中的相应职责
B. 就一个类而言,应该有且权有一个引起它变化的原因
C. 一个类承担的职责越多,越容易复用,被复用的可能性越大
D. 一个类承担的职责过多时需要将职责进行分离,将不同的职责封装在不同的类中
7.某系统通过使用配置文件,可以在不修改源代码的情况下更换数据库驱动程序,该系统满足( B )
A. 里氏代换原则 B. 接口隔离原则 C. 单一职责原则 D. 开闭原则
8.一个软件实体应尽可能少地与其他软件实体发生相互作用,这样,当一个模块修改时,就会尽量少的影响其他模块,扩展会相对容易。这是( A )的定义。
A. 迪米特法则 B. 接口隔离原则 C. 里氏代换原则 D. 合成复用原则
9.当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( A )模式。
A.创建型 B.结构型 C行为型 D.以上都可以
10.在观察者模式中,表述错误的是( C )
A.观察者角色的更新是被动的。
B.被观察者可以通知观察者进行更新
C.观察者可以改变被观察者的状态,再由被观察者通知所有观察者依据被观察者的状态进行。
D.以上表述全部错误
11.下面的类图表示的是哪个设计模式?( A )。
A.抽象工厂模式 B.观察者模式
C.策略模式 D.桥接模式
12.在采用“4+1”视图模型来描述软件体系结构中,系统工程师侧重于( D )
A. 实现视图 B. 进程视图 C. 逻辑视图 D. 部署视图
2、填空题(每空1分,共11分)
1.类体内成员有3个访问权限,说明它们的关键字分别是public、private和protected。
2.请从工厂、抽象工厂、原型、单例、外观、适配器、组合、代理、命令、迭代器、观察者、策略模式中选择合适的模式填入下列的空缺中。
1) 工厂模式中,父类负责定义创建对象的公共接口,子类决定要创建的具体类是哪一个。
2) 单例模式确保某一个类仅有一个实例,并自行实例化并向整个系统提供这个实例。
3) 外观 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,为子系统中的一组接口提供一个一致的界面,简化了一群类的接口。
4) 策略模式在对象的集合之中游走,而不暴露集合的实现。
5) 观察者 模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新,也就是让对象能在状态改变时被通知。
3.三层架构中的三层分别是指逻辑层、视图层和模型层。
3、问答题(每题5分,共20分)
1.简述“开—闭”原则的基本思想。请举出一个使用了软件“开—闭”原则的软件设计模式,其中何处体现了“开—闭”原则?
开闭原则:一个软件实体像类、模块和函数应该对扩展开放,对修改关闭。
抽象工厂模式:当添加新的产品族时,符合开闭原则,新增加的产品族,只需要对应增加一个新的具体工厂,对已有代码无须做任何修改。
2.抽象类和接口有什么区别?
(1)、一个类只能继承一个抽象类,而一个类却可以实现多个接口;
(2)、接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
(3)、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
(4)、接口只能包含方法声明,而抽象类还可以包含方法的定义。
3. GOF模式分为几种,每种包含哪些模式?以及这三种模式的作用.
创建型模式:简单工厂模式;工厂方法模式;抽象工厂模式(Abstract Factory);创建者模式; 原型模式;单例模式。
作用:抽象了实例化过程,帮助一个系立于如何创建、组合和表示他的那些对象。一个类创建型 模式使用继承改变被实例化的类
结构型模式:外观模式;适配器模式;代理模式;装饰模式;组合模式;桥模式;享元模式
作用:程序的结构上解决模块之间的耦合问题
行为型模式:观察者模式;状态模式;策略模式;命令模式;访问者模式;解释器模式; 备忘录模式;职责链模式;访问者模式;模板方法模式;迭代器模式
作用:分配算法和对象间的职责
4、简述框架与架构的区别?
框架是软件,架构不是软件
框架:应用的半成品,就是一组组件,供你选用完成你自己的系统
架构:是关于软件如何设计的重要策略。软件架构决策设计到如何将软件系统分解成不同的部分、各部分之间的静态结构关系和动态交互关系等
4、程序填空(每空2分,共20分)
1.某系统提供一个简单计算器,具有简单的加法和减法功能,系统可以根据用户的选择实例化相应的操作类,现使用简单工厂模式设计该系统。
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public virtual double GetResult()
{
double result = 0;
return result;
}
/// /// 数字A ///
public double NumberA
{
get
{
return _numberA;
}
set
{
_numberA = value;
}
}
/// /// 数字B ///
public double NumberB
{
get
{
return _numberB;
}
set
{
_numberB = value;
}
}
}
class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
/// /// 减法类 ///
class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
class OperationFactory
{
public static createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
}
return oper;
}
}
class Program
{
static void Main(string[] args)
{
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 3;
oper.NumberB = 5.5;
Console.WriteLine( oper.GetResult() );
Console.ReadKey();
}
}
2. 某公司开发儿童玩具汽车,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示,在该公司以往的产品中已经实现了控制灯光闪烁和声音提示的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性,使用适配器模式设计该系统。在代码中CarController类是汽车控制器,它包括三个方法用于控制汽车的行为,其中move()用于控制汽车的移动,play()用于控制汽车的声音,light()用于控制汽车灯光的闪烁, play()和light()是抽象方法。
interface Sound //抽象声音类
{
void phonate();
}
class ConcreteSound : Sound //具体声音类
{
public void phonate()
{
Console.WriteLine("声音播放!");
}
}
interface Lamp //抽象灯光类
{
void twinkle();
}
class ConcreteLamp : Lamp //具体灯光类
{
public void twinkle()
{
Console.WriteLine("灯光闪烁!");
}
}
interface CarController //汽车控制器
{
public void move()
{
Console.WriteLine("汽车移动!");
}
public abstract void play();
public abstract void light();
}
class CarAdapter : CarController //汽车适配器
{
private Sound sound;
private Lamp lamp;
public CarAdapter(Sound sound, Lamp lamp)
{
this.sound=sound ;
this.lamp=lamp ;
}
public override void play()
{
sound.phonate() ; //声音播放
}
public override void light()
{
lamp.twinkle(); //灯光闪烁
}
}
class Program
{
static void Main(string[] args)
{
Sound sound; Lamp lamp;
CarController car;
sound = new ConcreteSound();
lamp = new ConcreteLamp();
car = new CarAdapter(sound,lamp);
car.move();
car.play();
car.light();
Console.ReadKey();
}
}
5、编程题(25分)
1.用观察者模式C#实现。在气象观测中,它能够追踪目前的天气状况,包括温度和湿度。实现一个布告板,能够分别显示目前的状态,气象统计和简单的预报。当气象站中获取最新的测量数据时,三种布告板必须实时更新。(10分)。
2.用装饰者模式C#设计实现图书馆1楼的手抓饼销售程序,并画出相应的类图(15分)。
程序代码请见压缩包:
UML类图:
