【问题标题】:How to handle a great number of different Button commands?如何处理大量不同的 Button 命令?
【发布时间】:2016-05-28 09:39:09
【问题描述】:

我想解决 Java 中不同 Button 事件的变体:

我有十几个不同的按钮可以执行不同的操作。 总之,我有大约 40 到 50 个按钮或 40 到 50 个不同的可能命令。

然后我有很多参数,称为 a..z 和 A..Z。 每个 Button-Event 都会导致一些参数的递增,例如:
button#1a,b,c 和 u 递增
Button#2 >增加 f 和 y
Button#5增加 AFG 和 el

您可以看到,它变得非常复杂,但如果我不需要实现撤消选项,它仍然可以。

因此,我需要

  1. 以某种方式告诉我的模型增加一堆参数,而不是通过为每个可能的参数调用 .increaseA(); .increase_x(); .increaseWhatever();

  2. 记住并反转已处理的命令,相对于增加的参数(可能因类型和数量而异)

通常情况下,Command-Pattern 是我对 Undo-Options 的选择,但在这里我会得到超过 50 个不同的类,因为每个命令都会增加不同的参数,即使实际操作是相同:增加参数

如果有人能告诉我一个非常干净的解决方案,我将不胜感激。


到目前为止,我的方法是将命令模式与某种字符串解析器混合: 使用 hashmap,包含 button-id 作为 key,由要增加的参数组成的 String 作为 value。例如:<button1, "abcefgWY+1"> 然后我只需要带有字符串解析器的模型,这将解决命令......但这并不能解决 UNDO 问题,我想问这是否是一个好方法?

【问题讨论】:

    标签: java command action undo command-pattern


    【解决方案1】:

    您正在寻找外观设计模式...

    您可以在那里创建自定义子命令...

    但是当涉及到编码时,你可能会得到一个更简单的解决方案,你可以根据需要调用外观方法:

    private void increaseAllOf(String whichOne, int amount) {
    
        for (char c: whichOne.toCharArray() ){
            switch(c){
            case 'a' : {increaseWhereElse(amount);break;}
            case 'b' : {increaseOnOtherPlace(amount);break;}
    
            }
        }
    
    }
    

    您可以在 switch 语句中定义将调用哪个方法,具体取决于 whichOne-String 的字符

    【讨论】:

    • 如果可以的话,我会投票(没有足够的声誉)!谢谢!这不是整体解决方案,但肯定有很大帮助:)
    • 谢谢,如果我能提供进一步的想法,请告诉我 =)
    【解决方案2】:

    如果有一个 Integers 的 hashmap 与关联的字母作为键,值是像 myIntegers<Character, IntegerValue> 这样的实际值。

    您的<button1, "abcedgWY"> 可能更像<buttonX, buttonObject>,其中按钮对象是一个字符数组和一个计数器,用于记录发生了多少次递增,以便您知道允许多少次递减。使用每个字符作为 myIntegers hashmap 的键逐步遍历 Character 数组,并根据按钮或撤消选项递增或递减。

    如果只是一般的撤消操作,您将需要一个堆栈来推送和弹出,它可以是一个 buttonid 的堆栈。如果它是每个增量按钮的撤消按钮,您只需跟踪每个增量允许的撤消次数。

    【讨论】:

    • 感谢您的回答。当我按下 Button1 增加例如字符 abc,然后按 button2 增加 afg,然后按 button3 和 bhj...不会从 button3 撤消也不会从 button2 减少字符(太早)? (因为您说我可以根据计数器查看是否可以撤消)。我喜欢带有 Hashmap 的想法并使用 Stack 进行撤消(我已经考虑过使用):) 我应该提到,不可能连续多次按下同一个按钮。
    • 如果您仅通过弹出堆栈来驱动撤消调用,您根本不必担心顺序。我更关心您的撤消选项如何呈现给用户。在您的最后一条评论中,按 1、2、3 和撤消 3 就可以了。但是,如果您在没有首先检查 buttonObject 以查看它是否已递增的情况下显示已启用的撤消按钮,那么您将遇到递减问题。
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2021-12-30
    • 2016-09-24
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多