如何替换命令模式的静态元素初始化?

how to replace static elements initialization for Command pattern?

我想替换 if else 语句:

    if (userSalutation.equalsIgnoreCase("mr")) {
        screenPage.selectMr();
    } else {
        screenPage.selectMs();
    }

selectMr() 只需单击此按钮即可执行。

使用命令模式实现。
为此目的使用 enums 实现。

我必须将 if 用于网页元素(按钮):

代码片段:

public class ScanScreenPageStep1 extends PageObject {
    public ScanScreenPageStep1() {
        PageFactory.initElements(new EasyWebFieldDecorator(getDriver()), this);
    }
    @FindBy(id = "salutation")
    protected Button mr;

    @FindBy(id = "salutation2")
    protected Button ms;

这里是枚举查找:

public enum PersonSalutations {
        MR("mr") {
            @Override
            public Button getButton() {
                return mr;
            }
        },    
        MS("ms") {
            @Override
            public Button getButton() {
                return ms;
            }
        };
        private String salutation;

        PersonSalutations(String salutation) {
            this.salutation = salutation;
        }

        public static final Map<String, Button> stringToButton = new HashMap<>();            
        static {
            for (PersonSalutations salut : values()) {
                stringToButton.put(salut.toString(), salut.getButton());
            }
        }

        public String getSalutation() {
            return salutation;
        }

        public abstract Button getButton();

        public static Button fromString(String stringSalutation) {
            return stringToButton.get(stringSalutation);
        }    

        @Override
        public String toString() {
            return salutation.toUpperCase();
        }
    }

要将按钮元素添加到 stringToButton,我必须将我的按钮元素设为静态:

@FindBy(id = "salutation")
protected static Button mr;

@FindBy(id = "salutation2")
protected static Button ms;

如何避免在这种情况下使元素静态化?

或者这种情况下的一些其他情况。

您的 enum 定义概念按钮,而 protected Button mr 定义按钮的 实例 。除了单例模式,这就像向 Class 请求 class 的实例。您的代码有多个 Button 实例,因此单例不适用于此处。

您应该将 getButton 移动到 ScanScreenPageStep1,如下所示:

public Button getButton(PersonSalutations s) {
    if (s == PersonSalutations.MR)
        return this.mr;
    if (s == PersonSalutations.MS)
        return this.ms;
    throw new IllegalArgumentException("Invalid: " + s);
}

作为替代方案,将 ScanScreenPageStep1 作为参数添加到 getButton,因此枚举已知 which "step 1" 实例来获取按钮的。