用模式示例替换if else语句

时间:2018-09-02 22:10:58

标签: java android

基于SO上的各种线程(例如Replace Multiple If\Else with Design PatternReplacing if else statement with pattern),我了解可以用if\else statements替换多个Command pattern

但是对于我这个级别的人来说,答案远非简单或详尽。.我将有60个else if块..并且进行了一些研究,我发现命令模式是最佳的。.搜索教程关于如何逐步执行似乎很困难,因为我发现的所有内容都在复杂的问题上得到了解释。相信我,如果我不做很多研究并放弃互联网,我就不会在这里提出问题! (我相信这些问题的答案会受到尝试实现同一目标的人们的赞赏,因为到目前为止,互联网上还没有明显且结构合理的答案)

EDIT2:
这是我所有if块的结构:

 else if (data.equals("Exercice Inolerance, ")) {
        AddCode(mmDatabase.getTesta2());}

 else if (data.equals("Neta, ")) {
        AddCode(mmDatabase.getTesta3());}

PS:itemList.add的范围可以从1到10!

如何通过步骤..和谢谢将其转换为命令模式!

Item.Java

public class Item {

    private String name = "";

    public Item() {
    }

    public Item(String name){
        this.name = name;
    }

    public String getItemName() {
        return name;
    }

    public void setItemName(String name) {
        this.name = name;
    }

}

1 个答案:

答案 0 :(得分:2)

首先想到的是添加一个

Class<? extends Activity> handlerActivity;

字段添加到Item类,像在构造函数中一样将其初始化

new Item("Jenny",Figures.class);

并在您的onItemClick方法中执行

Intent intent = new Intent(DecisionTree.this, itemList.get(position).getHandlerActivity());
startActivity(i);

(或以其他任何方式将Item映射到其处理活动)

正如您对帖子的第一条评论所述,请勿仅出于应用模式而应用模式。当然,我在这里提供的解决方案远非完美,它只是为了帮助您摆脱ifs。我假设Jenny,Bladna和Drafat是某种业务常量,因此通常您会使用枚举常量或单独的类(如果您的设计更复杂)来实现多态行为

修改:这是您的代码

public class Item {

    private final String name;
    private final Class<? extends Activity> handlingActivity;

    public Item(String name, Class<? extends Activity> handlingActivity) {
        this.name = name;
        this.handlingActivity = handlingActivity;
    }

    public Class<? extends Activity> getHandlingActivity() {
        return handlingActivity;
    }

    public String getName() {
        return name;
    }
}

用法:

itemList.add(new Item("Jenny", Figures.class));
            itemList.add(new Item("Bladna", State.class));
            itemList.add(new Item("Drafat", Casa.class));
            itemListAdapter.notifyDataSetChanged();
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent intent = new Intent(DecisionTree.this, itemList.get(position).getHandlingActivity())
                            startActivity(intent);

                }
            }