Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在现有代码中添加/删除某些代码的设计/模式应该是什么_Java_Design Patterns - Fatal编程技术网

Java 在现有代码中添加/删除某些代码的设计/模式应该是什么

Java 在现有代码中添加/删除某些代码的设计/模式应该是什么,java,design-patterns,Java,Design Patterns,我在JAVA项目中得到了一个需求,该项目包含从现有工作副本中大量添加和删除源代码。没有别的出路了。根据设计合同,我不能修改源代码,所以我想到了继承这些特性,但这是唯一的方法吗?因为大约有2000多个文件发生了变化,并且由于JAVA中的访问说明符和final,每个文件继承都是不可能的 例如: 考虑一个名为MenuManager.java的文件有一个在菜单栏中添加10个菜单的方法。根据我的要求,我需要从现有的菜单中删除5个菜单,并将新定义的(3个)菜单添加到同一个菜单栏中。 因此,最简单的选择是覆盖

我在JAVA项目中得到了一个需求,该项目包含从现有工作副本中大量添加和删除源代码。没有别的出路了。根据设计合同,我不能修改源代码,所以我想到了继承这些特性,但这是唯一的方法吗?因为大约有2000多个文件发生了变化,并且由于JAVA中的访问说明符和final,每个文件继承都是不可能的

例如: 考虑一个名为MenuManager.java的文件有一个在菜单栏中添加10个菜单的方法。根据我的要求,我需要从现有的菜单中删除5个菜单,并将新定义的(3个)菜单添加到同一个菜单栏中。
因此,最简单的选择是覆盖方法,但如果整个源代码中都存在这种类型的功能更改,该怎么办?如果代码是在考虑插件体系结构的情况下开发的,则可以在构建过程或运行时启用和禁用您想要的和不想要的功能。问题是,听起来原始源代码并不是设计用来做这件事的

如果合适的话,继承是一种选择。您可能可以覆盖某些调用,使它们执行更多您想要的操作

在您的示例中,您可以在添加组件后修改组件:

    final JMenuBar menubar = new JMenuBar();
    SwingUtilities.invokeAndWait(new Runnable()
    {

        public void run()
        {
            JFrame f = new JFrame();
            f.setSize(300, 300);
            f.setJMenuBar(menubar);
            menubar.add(new JMenu("Magic"));
            menubar.add(new JMenu("Stain"));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });

    SwingUtilities.invokeAndWait(new Runnable()
    {

        public void run()
        {
            for(int i = 0; i < menubar.getMenuCount(); i++)
            {
                JMenu item = menubar.getMenu(i);
                if(item != null && "Magic".equals(item.getText()))
                {
                    menubar.remove(i);
                    i--;
                    menubar.doLayout();
                }
            }
        }
    });
final JMenuBar menubar=new JMenuBar();
SwingUtilities.invokeAndWait(新的Runnable()
{
公开募捐
{
JFrame f=新的JFrame();
f、 设置大小(300300);
f、 setJMenuBar(菜单栏);
菜单栏添加(新JMenu(“Magic”);
菜单栏。添加(新JMenu(“染色”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
});
SwingUtilities.invokeAndWait(新的Runnable()
{
公开募捐
{
for(int i=0;i
显然,您希望包装这种代码,以便轻松地从菜单栏中删除某些元素

关于你的问题,最难的是你有相反的要求。“我不能修改源代码”和“大量添加和删除源代码”


听起来你想把项目推向另一个方向。

如果代码是在考虑插件架构的情况下开发的,那么无论是作为构建过程的一部分还是作为运行时的一部分,你都可以启用和禁用你想要和不想要的功能。问题是,听起来原始源代码并不是设计用来做这件事的

如果合适的话,继承是一种选择。您可能可以覆盖某些调用,使它们执行更多您想要的操作

在您的示例中,您可以在添加组件后修改组件:

    final JMenuBar menubar = new JMenuBar();
    SwingUtilities.invokeAndWait(new Runnable()
    {

        public void run()
        {
            JFrame f = new JFrame();
            f.setSize(300, 300);
            f.setJMenuBar(menubar);
            menubar.add(new JMenu("Magic"));
            menubar.add(new JMenu("Stain"));
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    });

    SwingUtilities.invokeAndWait(new Runnable()
    {

        public void run()
        {
            for(int i = 0; i < menubar.getMenuCount(); i++)
            {
                JMenu item = menubar.getMenu(i);
                if(item != null && "Magic".equals(item.getText()))
                {
                    menubar.remove(i);
                    i--;
                    menubar.doLayout();
                }
            }
        }
    });
final JMenuBar menubar=new JMenuBar();
SwingUtilities.invokeAndWait(新的Runnable()
{
公开募捐
{
JFrame f=新的JFrame();
f、 设置大小(300300);
f、 setJMenuBar(菜单栏);
菜单栏添加(新JMenu(“Magic”);
菜单栏。添加(新JMenu(“染色”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
});
SwingUtilities.invokeAndWait(新的Runnable()
{
公开募捐
{
for(int i=0;i
显然,您希望包装这种代码,以便轻松地从菜单栏中删除某些元素

关于你的问题,最难的是你有相反的要求。“我不能修改源代码”和“大量添加和删除源代码”


听起来你想把项目转向另一个方向。

根据你的描述,似乎:

  • 当前的源代码不能满足您的要求
  • 您无法更改或轻松扩展源代码
如果这些都是确凿的事实,那么你将面临一个困难的局面。一种前进的方法是创建一个单独的体系结构,在使用现有功能有意义时对其进行包装,或者在难以重用时编写新代码。通过这种方式,可以将现有代码视为一个外部库,在有意义时使用它。我想到的一些模式是桥接器和适配器。继承通常不是一个好方法,因为它将扩展(子类)与超类耦合得太紧

所以,举个例子:

假设一个名为MenuManager.java的文件有一个在菜单栏中添加10个菜单的方法。现在根据我的要求,我需要从现有菜单中删除5个菜单,并在同一菜单栏中添加新定义的(由我)3个菜单

您可以这样做(这只是一个想法,与Swing之类的库无关):


//MyMenuManager.java根据您的描述,似乎:

  • 当前的源代码不能满足您的要求
  • 您无法更改或轻松扩展源代码
如果这些都是确凿的事实,那么你将面临一个困难的局面。一种方法是创建一个独立的架构