aloha1459 2024-05-11 14:46 采纳率: 0%
浏览 4

设计模式之组合模式改进

组合模式设计

img

请问如何修改才能让测试类更简洁,是否有方法能够通过配置文件调用同类的不同名称对象呢(不需要修改源代码的条件下)?

下面是我的XMLUtil:

package Composite.Composite;

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 {
    public static String getBean(){
        try
        {
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("config.xml"));

            NodeList nl = doc.getElementsByTagName("Name");
            Node classNode = nl.item(0).getFirstChild();
            String name = classNode.getNodeValue();
            return name;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
config.xml:
<?xml version="1.0" ?>
<config>
    <component>
        <Name>CS</Name>
    </component>
    <!-- 可以添加更多的组件 -->
</config>

Client:

package Composite.Composite;

public class Client {
    public static void main(String args[])
    {
        YZY0716Container dep,CS,ME,SE,AI,MD,EPD;
        YZY0716Stu stu;
        dep = new YZY0716Container("教务部");
        CS = new YZY0716Container("计算机学院");
        ME = new YZY0716Container("机械工程学院");
        SE = new YZY0716Container("软件工程系");
        AI = new YZY0716Container("人工智能系");
        MD = new YZY0716Container("机械系");
        EPD = new YZY0716Container("能动系");
        stu = new YZY0716Stu("张三"); SE.add(stu);
        stu = new YZY0716Stu("李思"); SE.add(stu);
        stu = new YZY0716Stu("王舞"); SE.add(stu);
        stu = new YZY0716Stu("刘俊"); AI.add(stu);
        stu = new YZY0716Stu("李晓"); AI.add(stu);
        stu = new YZY0716Stu("赵慧"); MD.add(stu);
        stu = new YZY0716Stu("王芳"); MD.add(stu);
        stu = new YZY0716Stu("阳湘"); EPD.add(stu);
        stu = new YZY0716Stu("田甜"); EPD.add(stu);
        CS.add(SE);CS.add(AI); ME.add(MD);ME.add(EPD);
        dep.add(CS);dep.add(ME);
        String name = XMLUtil.getBean();
        if(name.equals("dep")) dep.inform();
        else if(name.equals("CS")) CS.inform();
        else if(name.equals("ME")) ME.inform();
        else if(name.equals("SE")) SE.inform();
        else if(name.equals("AI")) AI.inform();
        else if(name.equals("MD")) MD.inform();
        else if(name.equals("EPD")) EPD.inform();
        else System.out.println(name + "该组织不存在!");
    }
}
  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-11 14:46
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】: 您提问的目的是想要改进现有的组合模式设计,使得测试类更加简洁,并且希望能够通过配置文件来调用不同名称的对象,而不需要修改源代码。

    【图片内容】: 您上传的图片是一个组织结构图,展示了一个多层的树形结构,其中包括教务部、计算机学院、机械工程学院等节点,以及它们下属的系和个人。

    【问题出现原因】: 问题出现的原因是当前的测试类代码中硬编码了许多对象的创建和组织关系,这使得代码不够灵活,且难以维护。同时,您希望能够通过外部配置文件来指定需要操作的对象,这样可以在不修改源代码的情况下进行调整。

    【问题解决方案】: 为了使测试类更简洁,并且能够通过配置文件调用不同名称的对象,我们可以采取以下步骤:

    1. 使用反射机制:通过配置文件中的类名,使用Java反射机制来动态创建对象实例。

    2. 改进XMLUtil:增强XMLUtil的功能,使其能够读取更复杂的配置,如对象的层次关系。

    3. 重构Client类:使用工厂模式或构建者模式来根据配置文件构建对象,而不是在Client类中硬编码。

    【提供代码】: 以下是改进后的XMLUtil示例代码,它可以读取配置文件中的组件名称,并使用反射来创建相应的对象实例:

    public class XMLUtil {
        public static Object getBean(String className) {
            try {
                Class<?> clazz = Class.forName(className);
                return clazz.getDeclaredConstructor().newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    

    在Client类中,您可以使用改进后的XMLUtil来动态创建对象:

    public class Client {
        public static void main(String args[]) {
            // ... 其他代码 ...
    
            String name = XMLUtil.getBean();
            Object component = XMLUtil.getBean(name);
    
            // 假设component是一个Container对象,可以调用add和inform方法
            if (component instanceof YZY0716Container) {
                YZY0716Container container = (YZY0716Container) component;
                // 构建container的子节点和学生,并添加到container中
                // ...
    
                container.inform();
            } else {
                System.out.println(name + "该组织不存在!");
            }
        }
    }
    

    【代码运行方式】: 您需要将上述代码放入您的Java项目中,并确保您的项目结构和类路径设置正确。您还需要确保config.xml文件位于项目的适当位置,以便XMLUtil能够正确读取。

    【代码预期运行结果】: 如果配置文件和代码正确无误,代码将根据config.xml中的配置动态创建相应的对象,并执行相应的操作,如发送通知。

    【推荐相关链接】:

    1. Java反射机制
    2. 组合模式(Composite Pattern)
    3. 工厂模式(Factory Pattern)
    4. 构建者模式(Builder Pattern)
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错