0

私は「コマンド」ソフトウェアデザインパターンに不慣れで、自分が何をしているのかをよく知らずにそれを試みました。これはStackOverflowにとって適切な質問ではないことは理解していますが、私のソースを見ると、私はそれに近づいているように見えますか?構築時にタスクを実行するオブジェクトを作成しました(スーパークラスは発生した例外を処理します)。

(編集#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();

コマンド パターンに関する最後の簡単な言葉 - ここでは例外処理を共有するために使用しています。これは本当にTemplateパターンを思い起こさせます。

パターンの威力は、抽象的なアクションがあり、実行時に正確なアクションが何であるかを知らなくても実行できるという事実から生まれます。パターンの使用例を次に示します: http://en.wikipedia.org/wiki/Command_pattern#Uses

于 2012-08-02T16:22:14.927 に答える