【问题标题】:How to save command pattern commands on a button?如何在按钮上保存命令模式命令?
【发布时间】:2021-06-04 06:00:39
【问题描述】:

我有一个应用程序,我希望用户能够从可能的操作列表中进行选择并将它们归因于一个按钮,即按钮 a 呼叫妈妈,滑块 b 设置计时器......等等。

我已经构建了大量命令类,并且我的按钮/滑块有一个遵循命令模式的命令“槽”。

但是如何保存用户的选择?我的持久数据在 JSON 中,我将在 JSON 中存储什么?对类名的某种引用?

在命令模式教程中,该示例通常用于上下文菜单,允许用户将操作分配给菜单选项,但他们从未提及实际保存用户选择的方式。

【问题讨论】:

  • 序列化超出了大多数设计模式的范围。事实上,您可以以任何您喜欢(或根本不)的方式序列化对象并满足命令模式。有许多专门用于对象序列化的库;但如果某种其他形式的标识符足以让您反序列化命令并且您不需要序列化完整的对象,那也可以。
  • 谢谢。我看了一下连载(阅读一些文章并观看了 30 分钟的讲座)。所有给定的示例都是针对具有属性的类,而不是具有仅在运行时才知道的参数的函数。

标签: android kotlin design-patterns command-pattern


【解决方案1】:

您可以使用备忘录设计模式。 使用这种模式,您可以将用户操作存储在内存中,还可以拥有操作历史记录,并根据用户需要撤消或重做它们。

您可以阅读更多here 这里是一个示例

public class Memento {
   private String state;

   public Memento(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }  
}


public class Originator {
   private String state;

   public void setState(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }

   public Memento saveStateToMemento(){
      return new Memento(state);
   }

   public void getStateFromMemento(Memento memento){
      state = memento.getState();
   }
}

import java.util.ArrayList;
import java.util.List;

public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();

   public void add(Memento state){
      mementoList.add(state);
   }

   public Memento get(int index){
      return mementoList.get(index);
   }
}


public class MementoPatternDemo {
   public static void main(String[] args) {
   
      Originator originator = new Originator();
      CareTaker careTaker = new CareTaker();
      
      originator.setState("State #1");
      originator.setState("State #2");
      careTaker.add(originator.saveStateToMemento());
      
      originator.setState("State #3");
      careTaker.add(originator.saveStateToMemento());
      
      originator.setState("State #4");
      System.out.println("Current State: " + originator.getState());      
      
      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("First saved State: " + originator.getState());
      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("Second saved State: " + originator.getState());
   }
}


Verify the output.


Current State: State #4
First saved State: State #2
Second saved State: State #3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2010-11-23
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多