了解命令模式以及为什么我们需要一个接口?

时间:2015-02-13 10:12:36

标签: java android command-pattern

我正在尝试减少用于在ListView(Android)中显示适当信息的if else构造

我创建了一个简单的命令界面用于学习目的,这里是:

interface CommandPattern {
    void execute();
} 

public class CommandA implements CommandPattern {
    public void execute(){
        System.out.println("I am Command A");
    }
}

public class CommandB implements CommandPattern{
    public void execute(){
        System.out.println("I am Command B");
    }
}

然后我的主要内容如下:

public class MainClass {
    static Map<String,CommandPattern> myCommand; //= new Map<String, CommandPattern>();
    public static void main(String[] args){
        myCommand = new HashMap<String, CommandPattern>();
        myCommand.put("A",new CommandA());
        myCommand.put("B",new CommandB());

        // In an ideal condition I will invoke the below by supplying values I get from the Database
        // myCommand.get(valuefromDB).execute();


        myCommand.get("B").execute();
        myCommand.get("A").execute();
    }
}

通过简单地调用适当类的execute方法,可以在不使用接口并从一个接口扩展的情况下完成上面所做的操作。使用界面的原因是什么?

其次是否意味着对于每个if - else分支我必须构建一个新类?不能用枚举来完成吗?

问题的背景:

我有一个数据库,我根据这个数据和一些标志来获取值,我处理要在每一行显示的数据。这个if else构造已经超出了我所能维持的范围。所以我想介绍一个Command模式。

2 个答案:

答案 0 :(得分:1)

实现接口:ClassA具有一些由InterfaceB定义的行为(即一种或多种方法)。

扩展课程说ClassA是一个特殊情况&#39; ClassB被扩展;即,ClassA具有ClassB的所有特征(数据和方法)以及添加和/或更改。

您可以使用其中一个实现Command模式;哪一个适合取决于具体情况。要避免的是在特殊情况下使用继承&#39;不适用;换句话说,不要只使用继承来在类中使用通用方法。

编辑:关于&#34;不能使用Enum完成这项工作吗?&#34;,它并不清楚你的意思是&#39;这个&#39;。

答案 1 :(得分:1)

演示使用界面的能力:

public class MainClass {
    static List<CommandPattern> myCommand; 
    public static void main(String[] args){
        myCommand = new ArrayList<>();
        myCommand.add(new CommandA());
        myCommand.add(new CommandB());

        for (CommandPattern command: myCommand) {
            command.execute();
        }

    }
}

此示例显示可以使用该界面执行两个不同的命令。 for循环只知道它可以在对象上调用èxecute(),但实际执行的代码会因依赖于接口的具体对象而异。

因为你想要摆脱if-else分支,我想你也可能想要研究一下策略模式。