Java 理解命令模式,为什么我们需要一个接口?

Java 理解命令模式,为什么我们需要一个接口?,java,android,command-pattern,Java,Android,Command Pattern,我试图减少if-else结构,我使用它在ListView(Android)中显示适当的信息 我为学习目的创建了一个简单的命令界面,如下所示: interface CommandPattern { void execute(); } public class CommandA implements CommandPattern { public void execute(){ System.out.println("I am Command A"); }

我试图减少if-else结构,我使用它在ListView(Android)中显示适当的信息

我为学习目的创建了一个简单的命令界面,如下所示:

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();
    }
}
public类MainClass{
静态映射myCommand;/=新映射();
公共静态void main(字符串[]args){
myCommand=newhashmap();
myCommand.put(“A”,新命令A());
myCommand.put(“B”,新命令B());
//在理想情况下,我将通过提供从数据库获得的值来调用下面的命令
//myCommand.get(valuefromDB.execute();
myCommand.get(“B”).execute();
myCommand.get(“A”).execute();
}
}
我在上面所做的不需要使用接口,也不需要通过调用适当类的execute方法来扩展接口。使用接口的原因是什么

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

问题的背景:


我有一个数据库,根据这些数据获取值,并处理每行中显示的数据。这个if-else结构已经超出了我所能维持的范围。所以我想介绍一种命令模式

实现接口:ClassA有一些由InterfaceB定义的、它支持的行为(即一个或多个方法)

扩展类表示类a是扩展类B的“特例”;i、 例如,ClassA具有ClassB的所有特征(数据和方法)以及添加和/或更改

您可以使用任意一种实现命令模式;哪一个合适取决于具体情况。要避免的是在“特殊情况”不适用的情况下使用继承;换句话说,不要仅仅为了类之间有一个公共方法而使用继承


编辑:关于“不能使用枚举完成此操作吗?”,不清楚您所说的“此”是什么意思。

要演示使用接口的功能:

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();
        }

    }
}
public类MainClass{
静态列表myCommand;
公共静态void main(字符串[]args){
myCommand=newarraylist();
添加(newcommanda());
添加(新命令b());
for(CommandPattern命令:myCommand){
command.execute();
}
}
}
此示例显示可以使用该接口执行两个不同的命令。for循环只知道它可以调用对象上的
èxecute()
,但实际执行的代码会根据附着到接口的具体对象而有所不同


既然您希望摆脱的是if-else分支,那么我认为您可能还需要研究一下策略模式

您试图消除哪些if/else构造。在使用之前,你应该仔细阅读这本书。通常,当您想重复一系列操作时,例如在执行宏或撤消功能时,应使用此选项。这似乎不适用于您的情况。我有一个数据库,我根据这些值和一些标志获取值,我处理每行中显示的数据。这个if-else结构已经超出了我所能维持的范围。所以我想介绍一个命令模式,一个简单的例子是期望从数据库中得到1到10的任何值,它可以很好地适应上面开发的模式。因此,基于这些值,我可以指导程序执行问题中列出的任何执行函数。实际上,我需要混合使用此命令模式和策略模式,因为存在if-else条件嵌套。但是我不想创建这么多的类,因为最终目标是在视图中显示,因为我使用的是listView,所以我要实现一个视图持有者模式,在不同的类中获取视图的处理程序会很繁琐。感谢mate澄清:)而不是为每个分支使用多个类,我不能使用枚举吗?这不够具体,无法回答。如何使用多个类?如何使用枚举?当你在问编程问题时,尤其是在这样的网络上,你必须给出我们没有其他方法可以理解的上下文和情况。。。