java程序设计(二选一)
题库 9 · 章节 93 · 共 6 题(案例 6)
1. (案例题)阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 (外观)模式是一种通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。以医院为例,就医时患者需要与医院不同的职能部门交互,完成挂号、门诊、取药等操作。为简化就医流程,设置了一个接待员的职位,代患者完成上述就医步骤,患者则只需与接待员交互即可。如5-1给出了以外观模式实现该场景的类图。

参考答案:
(1)String getName() (2)void dispose(Patient patient) (3)new ConcretePatient("") (4)Facade (5)new Facade(patient) (6)f.dispose()
2. (案例题)阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 在软件系统中,通常都会给用户提供取消、不确定或者错误的操作,允许将系统回复到原先的状态。现使用备忘录(Memento)模式实现该要求,得到如图6-1所示的类图。 Memento包含了要被恢复的状态。Originator创建并在Memento中存储状态。CareTaker负责从Memento中恢复状态。
【Java代码】 import java.util.*; class Memento { private String state; public Memento(String state) { this.state = state; } public String getState() { return state; } } class Originator { private String state; public void setState(String state) { this.state = state; } public String getState() { return state; } public Memento saveStateToMemento() { return (1) ; } public void getStateFromMemento(Memento Memento) { state = (2) ; } } class CareTaker { private List mementoList = new ArrayList(); public (3) { mementoList.add(state); } public (4) { return mementoList.get(index); } } class MementoPaneDemos { public static void main(String[] args) { Originator originator = new Originator(); CareTaker careTaker = new CareTaker(); originator.setState("State #1"); originator.setState("State #2"); careTaker.add( (5) ); originator.setState("State #3"); careTaker.add( (6) ); originator.setState("State #4"); System.out.println("Current State:" + originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println("First saved State:" + originator.getState()); originator.getStateFromMemento(careTaker.get(1)); System.out.println("Second saved State:" + originator.getState()); } }
参考答案:
(1)new Memento(state) (2)Memento.getState() (3)void add(Memento state) (4)Memento get(int index) (5)originator.saveState ToMemento() (6)originator.saveState ToMemento()
3. (案例题)阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 享元(FlyWeight)模式主要用于减少创建对象的数量,以降低内存占用,提高性能。先要开发一个网络围棋程序,允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序,得到如图6-1所示的类图。
【Java代码】 import java.util.*; enum PieceColor { BLACK, WHITE } // 棋子颜色 class PiecePos { // 棋子位置 private int x; private int y; public PiecePos(int a, int b) { x = a; y = b; } public int getX() { return x; } public int getY() { return y; } } abstract class Piece { // 棋子定义 protected PieceColor m_color; // 颜色 protected PiecePos m_pos; // 位置 public Piece(PieceColor color, PiecePos pos) { m_color = color; m_pos = pos; } (1) ; } class BlackPiece extends Piece { public BlackPiece(PieceColor color, PiecePos pos) { super(color, pos); } public void draw() { System.out.println("draw a blackpiece"); } } class WhitePiece extends Piece { public WhitePiece(PieceColor color, PiecePos pos) { super(color, pos); } public void draw() { System.out.println("white a blackpiece"); } } class PieceBoard { // 棋盘上已有的棋子 private static final ArrayList<(2)> m_arrayPiece = new ArrayList private String m_blackName; // 黑方名称 private String m_whiteName; // 白方名称 public PieceBoard(String black, String white) { m_blackName = black; m_whiteName = white; } // 一步棋,在棋盘上放一颗棋子 public void SetPiece(PieceColor color, PiecePos pos) { (3) piece = null; if (color == PieceColor.BLACK) { // 放黑子 piece = new BlackPiece(color, pos); // 获取一颗黑子 System.out.println(m_blackName + "在位置(" + pos.getX() + "," + pos.getY() + ")"); (4) ; } else { // 放白子 piece = new WhitePiece(color, pos); // 获取一颗白子 System.out.println(m_whiteName + "在位置(" + pos.getX() + "," + pos.getY() + ")"); (5) ; } m_arrayPiece.add(piece); } }
参考答案:
(1)public abstract void draw() (2)Piece (3)Piece (4)piece.draw() (5)piece.draw()
4. (案例题)阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单(如图6-1示例)中包含的可能是一个菜单项(直接对应某个功能),也可能是一个子菜单,现在采用组合(composite)设计模式实现层叠菜单,得到如图6-2所示的类图。层叠菜单(如图6-1示例)暂缺
图6-2 类图 【Java代码】 import java.util.*; abstract class MenuComponent { // 构成层叠菜单的元素 (1) String name; // 菜单项或子菜单名称 public void printName() { System.out.println(name); } public (2) ; public abstract boolean removeMenuElement(MenuComponent element); public (3) ; } class MenuItem extends MenuComponent { public MenuItem(String name) { this.name=name; } public boolean addMenuElement(MenuComponent element) { return false; } public boolean removeMenuElement(MenuComponent element) { return false; } public List getElement(){ return null; } } class Menu extends MemuComponent { private (4) ; public Menu(String name) { this.name = name; this.elementList = new ArrayList; } public boolean addMenuElement(MenuComponent element) { return elementList.add(element); } public boolean removeMenuElement(MenuComponent element) { return elementList.remove(element); } public List getElement() { return elementList; } } class CompositeTest { public static void main(String[] args) { MenuComponent mainMenu = new Menu("Insert"); MenuComponent subMenu = new Menu("Chart"); MenuComponent element = new MenuItem("On This Sheet"); (5) ; subMenu.addMenuElement(element); printMenus(mainMenu); } private static void printMenus(MenuComponent ifile) { ifile.printName(); List children = ifile.getElement(); if (children == null) return; for(MenuComponent element; children) { printMenus(element); } } }
参考答案:
(1)protected
(2)abstract boolean addMenuElement(MenuComponent element)
(3)abstract List
5. (案例题)阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 在线支付是电子商务的一个重要环节,不同的电子商务平台提供了不同的支付接口。现在需要整合不同电子商务平台的支付接口,使得客户在不同平台上购物时,不需要关心具体的支付接口。拟采用中介者(Mediator)设计模式来实现该需求,所设计的类图如图6-1所示。
【Java代码】 import java.util.*; interface WebServiceMediator { public (1) ; public void SetAmazon(WebService amazon); public void SetEbay(WebService ebay); } abstract class WebService { protected (2) mediator; public abstract void SetMediator(WebServiceMediator mediator); public (3) ; public abstract void search(double money); } class ConcreteServiceMediator implements WebServiceMediator { private WebService amazon; private WebService ebay; public ConcreteServiceMediator() { amazon = null; ebay = null; } public void SetAmazon(WebService amazon) { this.amazon = amazon; } public void SetEbay(WebService ebay) { this.ebay = ebay; } public void buy(double money, WebService service) { if (service == amazon) amazon.search(money); else ebay.search(money); } } class Amazon extends WebService { public void SetMediator(WebServiceMediator mediator) { this.mediator = mediator; } public void buyService(double money) { (4) ; } public void search(double money) { System.out.println("Amazon receive:" + money); } } class Ebay extends WebService { public void SetMediator(WebServiceMediator mediator) { this.mediator = mediator; } public void buyService(double money) { (5) ; } public void search(double money) { System.out.println("Ebay receive:" + money); } }
参考答案:
(1)void buy(double money, WebService service) (2)WebServiceMediator (3)abstract void buyService(double money) (4)mediator.buy(money, this) (5)mediator.buy(money, this)
6. (案例题)阅读下列说明和Java代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 某文件管理系统中定义了类OfficeDoc和DocExplorer。当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer)设计模式来实现该需求,所设计的类图如图6-1所示。
【Java代码】 import java.util.*; interface Observer { public (1) ; } interface Subject { public void Attach(Observer obs); public void Detach(Observer obs); public void Notify(); public void setStatus(int status); public int getStatus(); } class OfficeDoc implements Subject { private List< (2) > myObs; private String mySubjectName; private int m_status; public OfficeDoc(String name) { mySubjectName = name; this.myObs = new ArrayList(); m_status = 0; } public void Attach(Observer obs) { this.myObs.add(obs); } public void Detach(Observer obs) { this.myObs.remove(obs); } public void Notify() { for (Observer obs : this.myObs) { (3) ; } } public void setStatus(int status) { m_status = status; System.out.println("SetStatus subject[" + mySubjectName + "]status:" + status); } public int getStatus() { return m_status; } } class DocExplorer implements Observer { private String myObsName; public DocExplorer(String name, (4) sub) { myObsName = name; sub. (5) ; } public void update() { System.out.println("update observer[" + myObsName + "]"); } } class ObserverTest { public static void main(String[] args) { Subject subjectA = new OfficeDoc("subject A"); Observer observerA = new DocExplorer("observer A", subjectA); subjectA.setStatus(1); subjectA.Notify(); } }
参考答案:
(1)void update() (2)Observer (3)obs.update() (4)Subject (5)Attach(this)