Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么是设计模式,我们可以将字符串名称传递给一个方法,该方法选择调用哪个方法_Android_Design Patterns - Fatal编程技术网

Android 什么是设计模式,我们可以将字符串名称传递给一个方法,该方法选择调用哪个方法

Android 什么是设计模式,我们可以将字符串名称传递给一个方法,该方法选择调用哪个方法,android,design-patterns,Android,Design Patterns,我最近得到了以下示例,其中我们将动作名称作为字符串传递给方法,然后该方法决定需要调用的函数 这是解决问题的好方法还是有更好的方法 public static final String ACTION_CHARGING_REMINDER = "charging-reminder"; public static void executeTask(Context context, String action) { if (ACTION_INCREMENT_WATER_COUNT.equals(a

我最近得到了以下示例,其中我们将动作名称作为字符串传递给方法,然后该方法决定需要调用的函数

这是解决问题的好方法还是有更好的方法

public static final String ACTION_CHARGING_REMINDER = "charging-reminder";
public static void executeTask(Context context, String action) {
    if (ACTION_INCREMENT_WATER_COUNT.equals(action)) {
        incrementWaterCount(context);
    } else if (ACTION_DISMISS_NOTIFICATION.equals(action)) {
        NotificationUtils.clearAllNotifications(context);
    } else if(ACTION_CHARGING_REMINDER.equals(action)){
        issueChargeReminder(context);
    }
}

我会这样做。这可以根据您的需要进行扩展,显然这只是一个示例:

static abstract class ActionHandler {

    private String action;

    public ActionHandler(String action) {
        this.action = action;
    }

    public boolean canHandleAction(String input) {
        return this.action.equals(input);
    }

    public abstract void handleAction();
}

static class OneActionHandler extends ActionHandler {

    public OneActionHandler(String action) {
        super(action);
    }

    @Override
    public void handleAction() {
        //...
    }
}

static class TwoActionHandler extends ActionHandler {

    public TwoActionHandler(String action) {
        super(action);
    }

    @Override
    public void handleAction() {
        //...
    }
}

static class Test {

    private ActionHandler[] handlers;

    public Test() {
        handlers = new ActionHandler[]{new OneActionHandler("action1"), new TwoActionHandler("action2")};
    }

    public void handleAction(String action) {
        for(ActionHandler i : handlers) {
            if(i.canHandleAction(action)) {
                i.handleAction();
                break;
            }
         }
    }

}

这听起来很像react/redux模式

缩减器指定应用程序的状态如何响应 发送到商店的操作。记住,行动只描述什么 发生,但不要描述应用程序的状态如何更改


在这种特殊情况下。我宁愿使用I/OR,而不是引入很多类,如三类,然后您可以独立地测试和更改实现,添加新的情况等等。没有太多代码更改,您知道,在应用任何设计模式之前,您会考虑信息量。这种类似于责任链的设计模式引入了很多复杂性如果您认为这太复杂,那么您显然从未在大型应用程序上工作过。早期的懒惰只会让你以后的生活更加艰难。OP并没有具体说明他在这个应用程序中做了多少工作,但很明显,他处理的是通知、提醒之类的事情,这些提醒告诉我这可能是一个复杂的应用程序。无论如何,这是一个毫无意义的谈话,因为我没有要求你们评论它有多复杂,也没有要求其他任何人:OP可以决定他是否想使用它。请随意添加另一个答案,而不是暗示这对于一个你甚至不知道的应用来说太复杂了……我道歉。OP确实要求设计模式,因此责任链最适合这种情况。但我建议你把它变成一条真正的链条。创建一个方法来注册新的处理程序,并让链调用中的项注册下一个,而不是每个循环