4

软件体系结构与设计模式之组合模式

 1 year ago
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.
neoserver,ios ssh client

软件体系结构与设计模式之组合模式

精选 原创

黎大学问 2024-01-04 12:42:16 博主文章分类:软件设计模式与体系结构 ©著作权

文章标签 组合模式 java 设计模式 文章分类 Java 后端开发 阅读数177

一. 单选题(共4题)

  1. (单选题)一个树形文件系统体现了( )模式。
    A. Decorator(装饰)
    B. Composite(组合)
    C. Bridge(桥接)
    D. Proxy(代理)
    我的答案: B:Composite(组合);

  2. (单选题)以下关于组合模式的叙述错误的是( )。
    A. 组合模式对叶子对象和组合对象的使用具有一致性
    B. 组合模式可以通过类型系统来对容器中的构件实施约束,可以很方便地保证在一个容器中只能有某些特定的构件
    C. 组合模式将对象组织到树形结构中,可以用来描述整体与部分的关系
    D. 组合模式使得可以很方便地在组合体中加入新的对象构件,客户端不需要因为加入新的对象构件而更改代码
    我的答案: D:组合模式使得可以很方便地在组合体中加入新的对象构件,客户端不需要因为加入新的对象构件而更改代码;

  3. (单选题)下图是( )模式的结构图。

软件体系结构与设计模式之组合模式_java

A. 模板方法
B. 命令
C. 单例
D. 组合
我的答案: D:组合;

  1. (单选题, 5分)现需要开发一个XML文档处理软件,可以根据关键字查询指定内容,用户可以在XML中任意选取某一节点为查询的初始节点,无须关心该节点所处的层次结构。针对该需求,可以使用( )模式来进行设计。
    A. Abstract Factory(抽象工厂)
    B. Flyweight(享元)
    C. Composite(组合)
    D. Strategy(策略)
    我的答案: C: Composite(组合) ;

二. 填空题(共1题)
5. (填空题)某公司的组织结构图如图1所示,现采用组合设计模式来设计,得到如图2所示的类图。

软件体系结构与设计模式之组合模式_设计模式_02
软件体系结构与设计模式之组合模式_组合模式_03
其中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题)
6. (简答题)某教育机构组织结构如下图所示:

软件体系结构与设计模式之组合模式_java_04
在该教育机构的OA系统中可以给各级办公室下发公文,现采用安全组合模式设计该机构的组织结构,并在客户端代码中模拟下发公文。
1、画出UML类图;
软件体系结构与设计模式之组合模式_组合模式_05
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、运行效果图

软件体系结构与设计模式之组合模式_组合模式_06
  • 收藏
  • 评论
  • 分享
  • 举报

</div


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK