一. 单选题(共4题)
- (单选题)一个树形文件系统体现了( )模式。 A. Decorator(装饰) B. Composite(组合) C. Bridge(桥接) D. Proxy(代理) 我的答案: B:Composite(组合);
- (单选题)以下关于组合模式的叙述错误的是( )。 A. 组合模式对叶子对象和组合对象的使用具有一致性 B. 组合模式可以通过类型系统来对容器中的构件实施约束,可以很方便地保证在一个容器中只能有某些特定的构件 C. 组合模式将对象组织到树形结构中,可以用来描述整体与部分的关系 D. 组合模式使得可以很方便地在组合体中加入新的对象构件,客户端不需要因为加入新的对象构件而更改代码 我的答案: D:组合模式使得可以很方便地在组合体中加入新的对象构件,客户端不需要因为加入新的对象构件而更改代码;
- (单选题)下图是( )模式的结构图。
A. 模板方法 B. 命令 C. 单例 D. 组合 我的答案: D:组合;
- (单选题, 5分)现需要开发一个XML文档处理软件,可以根据关键字查询指定内容,用户可以在XML中任意选取某一节点为查询的初始节点,无须关心该节点所处的层次结构。针对该需求,可以使用( )模式来进行设计。 A. Abstract Factory(抽象工厂) B. Flyweight(享元) C. Composite(组合) D. Strategy(策略) 我的答案: C: Composite(组合) ;
二. 填空题(共1题)
- (填空题)某公司的组织结构图如图1所示,现采用组合设计模式来设计,得到如图2所示的类图。 其中Company 为抽象类,定义了在组织结构图上添加(Add)和删除(Delete)分公司/办事处或者部门的方法接口。类ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以设置不同的部门。类HRDepartment和FinanceDepartment 分别表示人力资源部和财务部。
【Java代码】
import java.util.*;
(1) Company {
protected String name;
public Company(String name) { (2) = name; }
public abstract void Add(Company c); // 增加子公司、办事处或部门
public abstract void Delete(Company c); // 删除子公司、办事处或部门
}
class ConcreteCompany extends Company {
private List< (3) > children = new ArrayList< (4) >(); // 存储子公司、办事处或部门
public ConcreteCompany(String name) { super(name); }
public void Add(Company c) { (5) .add(c); }
public void Delete(Company c) { (6) .remove(c); }
}
class HRDepartment extends Company {
public HRDepartment(String name) { super(name); }
// 其他代码省略
}
class FinanceDepartment extends Company {
public FinanceDepartment(String name) { super(name); }
// 其他代码省略
}
public class Test {
public static void main(String[] args) {
ConcreteCompany root = new ConcreteCompany("北京总公司");
root.Add(new HRDepartment("总公司人力资源部"));
root.Add(new FinanceDepartment("总公司财务部"));
ConcreteCompany comp = new ConcreteCompany("上海分公司");
comp.Add(new HRDepartment("上海分公司人力资源部"));
comp.Add(new FinanceDepartment("上海分公司财务部"));
(7) ;
ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
comp1.Add(new HRDepartment("南京办事处人力资源部"));
comp1.Add(new FinanceDepartment("南京办事处财务部"));
(8) ; // 其他代码省略
}
}
我的答案: (1) abstract class (2) this.name (3) Company (4) ConcreteCompany (5) children (6) children (7) root.Add(comp); (8) root.Add(comp1);
三. 简答题(共1题)
- (简答题)某教育机构组织结构如下图所示: 在该教育机构的OA系统中可以给各级办公室下发公文,现采用安全组合模式设计该机构的组织结构,并在客户端代码中模拟下发公文。 1、画出UML类图; 2、使用Java语言编程实现。
public abstract class AbstractBranch {
public abstract void receiveDoc();
public abstract String getName();
public abstract void setName(String name);
}
================================
public class AdOffice extends AbstractBranch{
private String name;
public void receiveDoc() {
System.out.println("行政办公室收到文件");
}
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
================================
import java.util.ArrayList;
public class Branch extends AbstractBranch{
private ArrayList<AbstractBranch>list;
private String name;
public Branch() {
}
public void receiveDoc() {
System.out.println(name+"收到文件");
}
public AbstractBranch getChild(int n) {
return list.get(n);
}
public void add(AbstractBranch abBranch) {
list.add(abBranch);
}
public void remove(AbstractBranch abBranch) {
list.remove(abBranch);
}
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
public void sendDoc(AbstractBranch abBranch) {
System.out.println(name+ "发送文件到"+abBranch.getName());
abBranch.receiveDoc();
}
}
===========================================
public class EdOffice extends AbstractBranch{
private String name;
public void receiveDoc() {
System.out.println("教务办公室收到文件");
}
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
=============================================
public class Client {
public static void main(String[] args) {
AbstractBranch ab1 = (AbstractBranch) XMLUtil.getBean();
ab1.setName("行政办公室");
AbstractBranch ab2 = (AbstractBranch) XMLUtil.getBean();
ab2.setName("教务办公室");
Branch b1 = (Branch)XMLUtil.getBean();
b1.setName("北京总部");
Branch b2 = (Branch)XMLUtil.getBean();
b2.setName("湖南分校");
Branch b3 = (Branch)XMLUtil.getBean();
b3.setName("长沙教学点");
Branch b4 = (Branch)XMLUtil.getBean();
b4.setName("湘潭教学点");
b1.sendDoc(b2);
System.out.println("============================");
b2.sendDoc(b3);
System.out.println("============================");
b2.sendDoc(b4);
System.out.println("============================");
b3.sendDoc(ab1);
System.out.println("============================");
b4.sendDoc(ab2);
}
}
============================================
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
public static Object getBean()
{
try
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("homework-07/combination.xml"));
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
==========================================
<?xml version="1.0"?>
<config>
<className>five.Branch</className>
</config>
3、运行效果图