我正在尝试减少用于在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模式。
答案 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分支,我想你也可能想要研究一下策略模式。