

软件体系结构与设计模式之组合模式
source link: https://blog.51cto.com/histry/9099563
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

软件体系结构与设计模式之组合模式
精选 原创一. 单选题(共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题)
5. (填空题)某公司的组织结构图如图1所示,现采用组合设计模式来设计,得到如图2所示的类图。


【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题)
6. (简答题)某教育机构组织结构如下图所示:

1、画出UML类图;

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、运行效果图

- 赞
- 收藏
- 评论
- 分享
- 举报
</div
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK