Java 理解命令模式,为什么我们需要一个接口?
我试图减少if-else结构,我使用它在ListView(Android)中显示适当的信息 我为学习目的创建了一个简单的命令界面,如下所示: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"); }
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澄清:)而不是为每个分支使用多个类,我不能使用枚举吗?这不够具体,无法回答。如何使用多个类?如何使用枚举?当你在问编程问题时,尤其是在这样的网络上,你必须给出我们没有其他方法可以理解的上下文和情况。。。