如何替换命令模式的静态元素初始化?
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" 实例来获取按钮的。
我想替换 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" 实例来获取按钮的。