0

我是“命令”软件设计模式的新手,我在不知道自己在做什么的情况下尝试了它。我知道这对于 Stack Overflow 来说并不完全是一个合适的问题,但是如果您查看我的来源,看起来我正在接近它吗?我已经制作了在构造它们时执行它们的任务的对象(而超类处理任何引发的异常。)

(编辑#1:这个源在另一个类中,一个字段包括“out”和“in”。)

public static interface Operations{
        public void action(String filename)
            throws FileNotFoundException, UnsupportedEncodingException, IOException;
    }

    public static abstract class Operator implements Operations{
        public Operator(String filename){
            try{
                action(filename);
            } catch(FileNotFoundException FNFE){
                sessionLog.report(FNFE.toString());
            } catch(UnsupportedEncodingException UEE){
                sessionLog.report(UEE.toString());
            } catch(IOException IOE){
                sessionLog.report(IOE.toString());
            } finally{

                try{
                    out.close();
                } catch(IOException IOE){
                    sessionLog.report("The file may not have closed properly. "+IOE.toString());
                } catch(NullPointerException NPE){
                    //sessionLog.report("The file may be null.");
                }
            }
        }
    }

    public static class Saver extends Operator{
        public void action(String filename) 
                throws FileNotFoundException, UnsupportedEncodingException, IOException{
            out = new OutputStreamWriter(new FileOutputStream(filename), ENCODE);
            out.write("Spoons.");
        }
        public Saver(String filename){super(filename);}
    }

    public static class Opener extends Operator{
        public void action(String filename) 
                throws FileNotFoundException, UnsupportedEncodingException, IOException{

            in = new InputStreamReader(new FileInputStream(filename), ENCODE);
            /* ... */
        }
        public Opener(String filename){super(filename);}
    }

    public static void save(String filename, ShoppingMutableTreeNode SMTN){
        new Saver(filename);
    }

    public static void open(String filename){
        new Opener(filename);
    }
4

1 回答 1

1

你的实现对我来说很好。不过有几点建议:

我会去掉 action() 的文件名参数,因为它可以让我做类似的事情

 new Saver("file1.txt").action("file2.txt");

我还将摆脱构造函数中的 action() 调用。我认为大多数开发人员不会在不深入研究您的源代码的情况下推断构造函数正在执行实际操作 - 它看起来并不直观。这样的事情会更明确:

 public abstract class Operation implements ... {
    private String filename;

    public Operation(String filename) { this.filename = filename; }

    public abstract void execute();
 }

然后你的代码可以调用它

 new SaveAction("myfile.txt").execute();

关于命令模式的最后一句话——您在这里使用它来共享异常处理。这真的让我想起了模板模式。

模式的强大之处在于您拥有抽象的动作并在不知道运行时的确切动作的情况下执行它们。以下是该模式的一些用途:http ://en.wikipedia.org/wiki/Command_pattern#Uses

于 2012-08-02T16:22:14.927 回答