首页 > 其他分享 >软件体系结构与设计模式之组合模式

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

时间:2024-01-04 13:32:23浏览次数:37  
标签:String 组合 void 软件体系结构 Branch 设计模式 AbstractBranch public name

一. 单选题(共4题)

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

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

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

image.png

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

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

二. 填空题(共1题) 5. (填空题)某公司的组织结构图如图1所示,现采用组合设计模式来设计,得到如图2所示的类图。 image.png image.png 其中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. (简答题)某教育机构组织结构如下图所示: image.png 在该教育机构的OA系统中可以给各级办公室下发公文,现采用安全组合模式设计该机构的组织结构,并在客户端代码中模拟下发公文。 1、画出UML类图; image.png 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、运行效果图 image.png

标签:String,组合,void,软件体系结构,Branch,设计模式,AbstractBranch,public,name
From: https://blog.51cto.com/histry/9099563

相关文章

  • 软件体系结构与设计模式之装饰模式和外观模式
    一.单选题(共4题)(单选题)某公司欲开发一个图形控件库,要求可以在该图形控件库中方便地增加新的控件,而且可以动态地改变控件的外观或给控件增加新的行为,如可以为控件增加复杂的立体边框、增加控件的鼠标拖拽行为等。针对上述需求,使用()模式来进行设计最合适。A.适配器(Adap......
  • 软件体系结构与设计模式之享元模式和代理模式
    一.单选题(共6题)(单选题)在享元模式中,外部状态是指()。A.享元对象可共享的所有状态B.享元对象可共享的部分状态C.由享元对象自己保存和维护的状态D.由客户端保存和维护的状态我的答案:D:由客户端保存和维护的状态;正确答案:D:由客户端保存和维护的状态;(单选......
  • 软件设计模式与体系结构之运算器的设计
    实验目的与要求 深刻理解面向对象编程思想与设计原则,熟悉Java语言中类的声明、属性的声明、方法的定义、对象的创建与使用等语法知识,能够根据具体问题完成对象的抽象、类的定义及程序的编写,并在程序中使用适当的设计原则,初步体验面向对象编程的优点。实验内容 使用Java语言编写一......
  • 软件设计模式与体系结构之简单工厂模式和工厂方法模式
    一、实验目的掌握简单工厂模式和工厂方法模式的概念,能够灵活使用简单工厂模式和工厂方法模式解决相关问题。二、实验内容场景描述一:在某OA系统中,系统根据对比用户在登录时输入的账号和密码以及在数据库中存储的账号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据......
  • 软件设计模式与体系结构之抽象工厂模式与建造者模式
    实验三:抽象工厂模式与建造者模式一、实验目的掌握抽象工厂模式和建造者模式的概念,能够灵活使用抽象工厂模式和建造者模式解决相关问题。二、实验内容场景描述一:某手机游戏软件公司欲推出一款新的游戏软件,该软件能够支持Symbian和Android等多个主流的手机操作系统平台,针对不同......
  • 【设计模式】单例模式——反序列化破坏单例模式的情景
    一个单例对象创建好之后,有时候需要将对象序列化然后进行数据持久化,下次使用的时候通过反序列化转化为内存对象。反序列化后的对象会重新分配内存,会破坏单例模式。首先看支持序列化的单例类的代码://实现Serializable即可实现序列化和反序列化publicclassSingletonimplementsSe......
  • 设计模式--单例模式
    设计模式是软件工程中共同的问题的解决方案,这些方案经过了验证和总结,能够在不同的情境中提供最佳的解决途径。设计模式主要分为三类:创建型模式、结构型模式和行为型模式。以下是这三类模式中的23个经典设计模式的列表:创建型模式(CreationalPatterns):创建型模式涉及对象的初始化和......
  • Java设计模式-策略模式
    简介策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法策略模式:定义了一组算法(业务规则)封装了每个算法这族的算法可互换代替组成抽象策略角色:策略类,通常由一个接口或者抽象类实现具体策略角......
  • 【设计模式】单例模式——clone()方法破坏单例模式的情景
    Java的对象不仅可以new关键字产生,也可以利用clone()方法产生,或者利用反射和反序列化产生。用DCL或静态内部类实现单例模式都是利用private修饰构造函数来解决new关键字产生多个对象的问题的,但单例模式仍然可以被clone()方法、反射和反序列化破坏。如下代码所示,让单例类实现Cloneabl......
  • 小谈设计模式(28)—解释器模式
    (小谈设计模式(28)—解释器模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。解释器模式解释器模式是一种行为型设计模式,它提供了一种解释一个语言的方式,用于解析......