1. (填空题)
某软件公司要开发一个数据格式转换工具,可以将不同数据源如txt文件、数据库、Excel表格中的数据转换成XML格式。为了让系统具有更好的可扩展性,在未来支持新类型的数据源,开发人员使用工厂方法模式设计该转换工具的核心类。在工厂类中封装了具体转换类的初始化和创建过程,客户端只须使用工厂类即可获得具体的转换类对象,再调用其相应方法实现数据转换操作。其类图如下所示:
在图中,ConvertorCreator是抽象工厂接口,它声明了工厂方法getConvertor(),在其子类中实现该方法,用于创建具体的转换对象;Convertor是抽象产品接口,它声明了抽象数据转换方法transform(),在其子类中实现该方法,用于完成具体的数据转换操作。类DBConvertor和TXTConvertor分别用于将数据库中的数据和TXT文件中的数据转换为XML格式。
请完成以下Java代码中的填空及后面选择填空。
【Java代码】
interface ConvertorCreator {
;
}
interface Convertor {
public String transform();
}
class DBConvertorCreator implements ConvertorCreator{
public Convertor getCovertor(){
;
}
}
class TXTConvertorCreator implements ConvertorCreator{
public Convertor getCovertor(){
;
}
}
class DBConvertor implements Convertor{
public String transform(){
//实现代码省略
}
}
class TXTConvertor implements Convertor{
public String transform(){
//实现代码省略
}
}
class Test{
public static void main(String[] args) {
ConvertorCreator creator;
;
creator = new DBConvertorCreator();
convertor = ;
convertor.transform();
}
}
如果需要针对一种新的数据源进行数据转换,该系统至少需要增加 个类。工厂方法模式体现了以下面向对象设计原则中的 (可以多选)。
A、开闭原则 B、依赖倒转原则 C、接口隔离原则 D、单一职现原则
E、合成复用原则
正确答案:
(1) public Convertor getConvertor()
(2) return new DBConvertor()
(3) return new TXTConvertor()
(4) Convertor convertor
(5) creator.getConvertor()
(6) 2
(7) ABD
2. (填空题)某系统提供一个简单计算器,具有简单的加法和减法功能,系统可以根据用户的选择实例化相应的操作类。现使用简单工厂模式设计该系统,类图如下所示:
在图中,Operation是抽象类,其中定义了抽象方法getResult(),其子类AddOperation 用于实现加法操作,SubOperation用于实现减法操作。Calculator是简单工厂类,工厂方法为crcateOperation(),该方法接收一个char类型的字符参数,如果传入的参数为“+”,工厂方法返回一个AddOperation类型的对象,如果传入的参数为“-”,则返回-个SubOpcration类型的对象。
请完成以下Java代码中的填空。
【Java代码】
abstract class Operation {
protected int numberA;
protected int numberB;
//numberA和numberB的Setter方法和Getter方法省略
public ____int getResult();
}
class AddOperation extends Operation{
public int getResult(){
return numberA + numberB;
}
}
class SubOperation extends Operation{
public int getResult(){
return numberA - numberB;
}
}
class Calculator{
public ____createOperation(char operator){
Operation op = null;
____{
case '+':
op = ____;
break;
case '-':
op = ____;
break;
}
____;
}
}
class Test{
public static void main(String args[]){
int result;
Operation op1 = Calculator.createOperation('+');
op1.setNumberA(20);
op1.setNumberB(10);
result = ____;
System.out.println(result);
}
}
正确答案:
(1) abstract
(2) static Operation
(3) switch(operator)
(4) new AddOperation()
(5) new SubOperation()
(6) return op
(7) op1.getResult()
3. (填空题)为了避免监控数据显示不一致并节省系统资源,在某监控系统的设计方案中提供了一个主控中心类,该主控中心类使用单例模式进行设计,类图如下图所示:
请完成以下Java代码中(1)--(3)空的代码填写,以及执行后(4)--(7)空填写。
在图中,主控中心类MainControllerCenter是单例类,它包含一系列成员对象并可以初始化、显示和销毁成员对象,对应的方法分别为init()、load()和destroy(),此外还提供了静态工厂方法getInstance()用于创建MainControllerCenter类型的单例对象。完成下列Java代码中的填空,以及后面的分析填空。
【Java代码】
class MainControllerCenter {
private Menu menu; //主控中心菜单
private ToolBar tb; //主控中心工具栏
private MainForm mf; //主控中心主窗口
private ____MainControllerCenter mcc;
____ MainControllerCenter{
}
public void init(){
menu = new Menu();
tb = new ToolBar();
mf = new MainForm();
}
public void load(){
menu.display();
tb.display();
mf.display();
}
public void destroy(){
menu.destroy();
tb.destroy();
mf.destroy();
}
public static MainControllerCenter getInstance(){
if(mcc == null){
____;
}
return mcc;
}
}
class Test{
public static void main(String args[]){
MainControllerCenter mcc1,mcc2;
mcc1 = MainControllerCenter.getInstance();
mcc2 = MainControllerCenter.getInstance();
System.out.println(mcc1 == mcc2);
}
}
//其他代码省略
编译并运行上述代码,输出结果为(____ )。
在本实例中,使用了(____ )(填写懒汉式或饿汉式)单例模式,其主要优点是(____ ),主要缺点是(____ )。
正确答案:
(1) static
(2) private
(3) mcc = new MainControllerCenter()
(4) true
(5) 懒汉式
(6) 使用的时候再实例化,可节约资源
(7) 必须处理好多线程访问问题,速度和反应时间相对“饿汉式”较慢
4. (填空题)某数据处理软件需要增加一个图表复制功能,在图表对象中包含一个数据集对象,用于封装待显示的数据,可以通过界面的“复制”按钮将该图表复制一份,复制后可以得到新的图表对象,用户可以修改新图表的编号、颜色和数据。现使用原型模式设计该软件,所得类图如下所示:
请完成以下Java代码中的代码填空,以及执行后的填空。
在该设计方案中,DataChart类包含一个DataSet对象,在复制DataChart对象的同时将复制DataSet对象,因此需要使用深克隆技术,可以用流来实现深克隆。
【Java代码】
import java.io.*;
class DataSet implements Serializable{
//具体实现代码省略
}
class Color implements Serializable{
//具体实现代码省略
}
class DataChart implements Serializable{
private DataChart ds = new DataChart();
private Color color = new Color();
private int no;
//成员属性的Getter方法和Setter方法省略
public void display(){
//具体实现代码省略
}
//使用流实现深克隆,复制容器的同时复制成员
public ____deepClone() throws IOException,ClassNotFoundException,OptionalDataException{
//将对象写入流中
ByteArrayOutputStream bao = new ByteArrayOutputStream();
ObjectOutputStream oos = new ____;
oos.writeObject(____);
//将对象从流中取出
ByteArrayInputStream bis = new ByteArrayOutputStream(bao.toByteArray());
ObjectInputStream ois = new ____;
return(____);
}
}
class Test{
public static void main(String[] args) {
DataChart chart1,chart2 = null;
chart1 = new DataChart();
try{
chart2 = (DataChart)chart1.deepClone();
}catch (Exception e){
e.printStackTrace();
}
System.out.println(chart1 == chart2);
System.out.println(chart1.getDs() == chart2.getDs());
System.out.println(chart1.getNo() == chart2.getNo());
}
}
编译并运行上述代码,输出结果为:(____)(____)(____)。
在本实例中,DataChart类和DataSet类需要实现Serializable接口的原因是(____)。
正确答案:
(1) Object
(2) ObjectOutputStream(bao)
(3) this
(4) ObjectInputStream(bis)
(5) ois.readObject()
(6) false
(7) false
(8) true
(9) 只有实现了Serializable接口类的对象才能写入流中
5. (填空题)某手机游戏软件公司要推出一款新的游戏软件,该软件能够Symbian、Android和Windows Mobile等多个主流的手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制类和游戏界面控制类,并提供相应的工厂类来封装这些类的初始化。软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,采用抽象工厂模式进行设计所得类图如下所示:
请完成以下Java代码中(1)--(9)空的代码填写。
在该设计方案中,具体工厂类如SymbianFactory用于创建Symbian操作系统平台下的游戏操作控制类SymbianOperationController和游戏界面控制类SymbianInterfaceController,再通过它们的业务方法来实现对游戏软件的初始化和运行控制。完成如下Java代码中的填空及后面的分析填空。
【Java代码】
interface AbstractFactory{
public OperationController getOpenationController();
public InterfaceController getInterfaceController();
}
interface OperationController{
public void init();
//其他方法声明省略
}
interface InterfaceController{
public void init();
//其他方法声明省略
}
class SymbianFactory implements AbstractFactory{
public OperationController getOpenationController(){
____;
}
public InterfaceController getInterfaceController(){
____;
}
}
class AndroidFactory ____{
public OperationController getOpenationController(){
return new AndroidOperationController();
}
public InterfaceController getInterfaceController(){
return new AndroidInterfaceController();
}
}
class SymbianOperationController ____{
public void init(){
//实现代码省略
}
//其他方法声明省略
}
class AndroidOperationController ____{
public void init(){
//实现代码省略
}
//其他方法声明省略
}
class SymbianInterfaceController implements InterfaceController{
public void init(){
//实现代码省略
}
//其他方法声明省略
}
class AndroidInterfaceController implements InterfaceController{
public void init(){
//实现代码省略
}
//其他方法声明省略
}
class Test{
public static void main(String[] args) {
AbstractFactory af;
____ oc;
____ ic;
af = new SymbianFactory();
oc = ____;
ic = ____;
oc.init();
ic.init();
}
}
在上述设计方案中如何增加对Windows Mobile操作系统的支持?需对该设计方案进行哪些调整?简单说明实现过程____。
正确答案:
(1) return new SymbianOperationController()
(2) return new SymbianInterfaceController()
(3) implements AbstractFactory
(4) implements OperationController
(5) implements OperationController
(6)OperationController
(7) InterfaceController
(8)af.getOperationController()
(9) af.getInterfaceController()
(10) 如果需要增加对Windows Mobile操作系统的支持,需要增加三个类,其中WindowsOperationController作为OperationController接口的子类,WindowsInterfaceController作为InterfaceController接口的子类,再对应增加一个具体工厂类WindowsFactory实现AbstractFactory接口,并实现在其中声明的工厂方法,创建WindowsOperationController对象和WindowsInterfaceController对象
6. (填空题)某软件公司要开发一个音频和视频播放软件,为了给用户使用提供方便,该播放软件提供了多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。现使用建造者模式设计该软件,所得类图如下所示:
请完成以下Java代码中的代码填空。
在该设计方案中,MainScreen是播放器的主界面,它是一个复合对象,包括菜单、播放列表、主窗口和控制条等成员。ModeBuilder是一个抽象类,定义了一组抽象方法buildXXX()用于逐步构造一个完整的MainScreen对象,getScreen()是工厂方法,用于返回一个构造好的MainScreen对象。ScreenModeController充当指挥者,用于指导复合对象的创建,其中construct()方法封装了具体创建流程,并向客户返回完整的产品对象。
【Java代码】
class MainScreen{
public String menu;
public String playList;
public String mainWindow;
public String controlBar;
}
____class ModeBuilder{
protected MainScreen screen = new MainScreen();
public abstract void buildMenu();
public abstract void buildPlayList();
public abstract void buildMainWindow();
public abstract void buildControlBar();
public MainScreen getScreen(){
____;
}
}
class FullModeBuilder extends ModeBuilder{
public void buildMenu(){//实现代码省略}
public void buildPlayList(){//实现代码省略}
public void buildMainWindow(){//实现代码省略}
public void buildControlBar(){//实现代码省略}
}
class SimpleModeBuilder extends ModeBuilder{
public void buildMenu(){//实现代码省略}
public void buildPlayList(){//实现代码省略}
public void buildMainWindow(){//实现代码省略}
public void buildControlBar(){//实现代码省略}
}
class ScreenModeController{
private ModeBuilder mb;
public void setModeBuilder(____){
this.mb = mb;
}
public MainScreen construct(){
MainScreen ms;
mb.buildMenu();
mb.buildPlayList();
mb.buildMainWindow();
mb.buildControlBar();
ms = ____;
return ms;
}
}
class Test{
public static void main(String[] args) {
ScreenModeController smc = ____;
ModeBuilder mb;
mb = new FullModeBuilder();//构造完整模式界面
MainScreen screen;
smc.setModeBuilder(____);
screen = ____;
System.out.println(screen.menu);
//其他代码省略
}
}
正确答案:
(1) abstract
(2) return screen
(3) ModeBuilder mb
(4) mb.getScreen()
(5) new ScreenModeController()
(6) mb
(7) smc.construct()