【发布时间】:2020-05-31 22:12:02
【问题描述】:
我正在尝试创建一项服务来处理不同的付款方式。我想实施策略模式。我想要一个具有不同付款方式的枚举。这是我所拥有的一个例子:
public enum Pay {
CREDITCARD(1) {
@Override
public void pay() {
System.out.println("Payment functionality");
}
},
OTHERMETHOD(2) {
@Override
public void pay() {
System.out.println("Payment functionality");
}
};
private int id;
Payment(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public abstract void pay();
}
在客户端某处:
user.setPay(Pay.CREDITCARD);
user.pay();
这种方法的问题是“支付”方法可能有很多逻辑,所以我想把它放在不同的类中。我可以定义这样的接口:
public interface Pay {
void pay();
}
public class CreditCard implements Pay {
@Override
public void pay() {
}
}
public class OtherMethod implements Pay {
@Override
public void pay() {
}
}
在客户端某处:
if (method.equals("creditcard")) {
user.setPay(new CreditCard());
user.pay();
}
else {
user.setPay(new OtherMethod());
user.pay();
}
但我更喜欢 Enum 的外观以及保持这种方式的原因。谢谢
【问题讨论】:
-
那不是
Pay,那是PaymentMethod。显然有不同的信用卡,毕竟我的名字和你的不同。当您致电setPay()然后使用pay()时,情况会变得更糟。试试setPaymentMethod()- 你会发现pay也不能只用一种支付方式,你需要一张实际的卡。 ID 本身没有意义,已经有一个ordinal()方法。如果你在课堂设计的早期犯了这样的错误,那么当你深陷其中时,将很难追溯。
标签: java design-patterns