山东大学软件学院2022年春面向对象开发技术期末考试试题
时间:2022年6月23日 08:30-10:30
简答题(6分*5 = 30分)
-
简述多态的四种形式。
-
简述OOPL可能采用的内存分配方式。
-
解释什么叫做面向接口编程,请问在通过接口的形式调用对象时有什么优势?
-
ppt原题(考试考了后六个)
public class Bird { public void fly(Bird p) { System.out.println("Bird fly with Bird"); } } public class Eagle extends Bird { public void fly(Bird p) { System.out.println("Eagle fly with Bird!"); } public void fly(Eagle e) { System.out.println("Eagle fly with Eagle!"); } } Bird p1 = new Bird(); Bird p2 = new Eagle(); Eagle p3 = new Eagle(); p2.fly(p1); Eagle fly with Bird! p2.fly(p2); Eagle fly with Bird! p2.fly(p3); Eagle fly with Bird! p3.fly(p1); Eagle fly with Bird! p3.fly(p2); Eagle fly with Bird! p3.fly(p3); Eagle fly with Eagle!
-
选择题,选择设计模式,给了很多设计模式让你去选择
(1) 有很多只类型的毛笔,也有很多种颜色,请问应该选用哪种设计模式
(2) 一个类现在有sort(),serach()方法需要被实现,但是我现在有BinarySearch类的binarySearch()方法和QuickSort类的qucikSort()方法,请问应该选用何种设计模式实现
(3) 当多个用户请求计算机执行打印操作时时,可以通过连接池相应用户的请求,请问连接池的实现应该采用什么模式?
设计题(20分*3 = 60分)
-
我们知道轨迹球可以用来定位图形界面的指针的位置,鼠标也可以定位图形界面指针的位置,而且两者的实现非常相似,我们现在让轨迹球类继承鼠标类。请问这样的设计模式有什么问题,违反了哪个设计原则,并说明你的理由。对于这样的问题,你认为应该怎样改进,画出类图和写出代码框架。
-
现在又一个工厂可以生产多种类型的电视机,我们现在想让工厂的子工厂单独生产一种电视机,比如海尔工厂就生产海尔类型的电视机,海信工厂就生产海信电视机,请给出设计模式,满足在不修改上述类的前提下就可以增加生产电视机的工厂,并画出类图和写出代码框架。
-
(1) 现在有一个房地产公司可以售卖多种类型的房子,比如公寓,别墅等等
(2) 每当销售人员将房子卖出去之后,主管就会接受到相应的消息。
请结合(1)和(2),请问应该选择哪些设计模式来实现这样一个房地产信息管理系统,请分别描述你的设计模式并画出类图。
(大致是这个意思,描述可能会有些许偏差)
代码填空题(5个空 10分)
发票问题,ppt原题改编
ppt题目:
-
假设你需要打印发票 sales ticket , 发票有抬头、正文和脚注,发票抬头可以是企事业单位,发票号等等,脚注也是一样,可能有很多不同种类的脚注需要打印。如果发票格式固定那也就没必要继续讨论了,现在的问题是,不同的客户需要的发票或者收据的抬头或脚注,他们需要的条目是不一样的,有的需要著明单位,有的只需要发票号,但是脚注需要开票人, 等等,对你来说跟现在的 Web 系统一样,客户的要求是动态;不过发票的正文是不会变化的,是固定的.
-
如果你的发票格式为: SalesTicket Header1 SalesTicket Body SalesTicket Footer1 那么你可以这样去创建对象: new Header1(new Footer1(new SalesTicket())); 如果你的发票格式为: SalesTicket Header1 SalesTicket Header2 SalesTicket Body SalesTicket Footer1 那么你可以这样去创建对象: new Header1(new Header2(new Footer1(new SalesTicket())));
// 原题代码回忆 class Invoice { protected Invoice ticket; // 有个是定义了ticket变量 public void printInvoice() { System.out.println("This is the content of the invoice!"); } } class Decorator extends Invoice { public Decorator(Invoice t) { ticket = t; } public void printInvoice() { if (ticket != null) { // 填写区域1:ticket.printInvoice(); ticket.printInvoice(); } } } class HeadDecorator extends Decorator { public HeadDecorator(Invoice t) { super(t); } public void printInvoice() { System.out.println("This is the head of the invoice!"); // 填写区域2:ticket.printInvoice(); ticket.printInvoice(); } } class FootDecorator extends Decorator { public FootDecorator(Invoice t) { super(t); } public void printInvoice() { // 填写区域3:ticket.printInvoice(); ticket.printInvoice(); System.out.println("This is the foot of the invoice!"); } } public class Test { public static void main(String[] args) { Invoice t = new Invoice(); Invoice ticket; ticket = new HeadDecorator(new FootDecorator(new Decorator(t))); // 填写区域4: new HeadDecorator(new FootDecorator(new Decorator(t))); ticket.printInvoice(); System.out.println("-----------------------"); ticket = new HeadDecorator(new FootDecorator(new Decorator(null))); // 填写区域5:new HeadDecorator(new FootDecorator(new Decorator(null))); ticket.printInvoice(); } } // 考试时FootDecorator和HeadDecorator继承自Decorator,Decorator继承自Invoice. 注意细节即可
上述回忆会有些许偏差,但是表达了原题的大致意思。