我试图通过一个例子来理解这种干净的代码实践。考虑具有折扣开关盒的类产品。我正在尝试用多态性替换 switch 语句。
代码之前:
class Product {
String priceCode;
int discount;
Product(String priceCode) {
setDiscount(priceCode);
}
public int getDiscount() {
return discount;
}
public void setDiscount(String priceCode) {
switch (priceCode) {
case "CODE1":
discount = // some logic;
case "CODE2":
discount = // some other logic;
case "CODE3":
discount = // some other logic;
}
}
}
在下面的代码中,您可以看到我删除了 switch 语句,但我仍然有 if 条件来创建折扣策略对象。
我的问题是我仍然有 if 条件,我试图用多态性来消除这些条件。
代码后:
class Product {
String priceCode;
DiscountStrategy discountStrategy;
Product(String priceCode) {
setDiscount(priceCode);
}
public int getDiscount() {
return discountStrategy.getDiscount();
}
public void setDiscount(String priceCode) {
if (priceCode.equals("CODE1")) {
discountStrategy = new DiscountStrategy1();
} else if (priceCode.equals("CODE2")) {
discountStrategy = new DiscountStrategy2();
}
// ...
}
}
interface DiscountStrategy {
public int getDiscount();
}
class DiscountStrategy1 implements DiscountStrategy {
public int getDiscount() {
// calculate & return discount;
}
}
class DiscountStrategy2 implements DiscountStrategy {
public int getDiscount() {
// calculate & return discount;
}
}
class DiscountStrategy3 implements DiscountStrategy {
public int getDiscount() {
// calculate & return discount;
}
}
您能否帮助我理解这个概念并更好地实现这个示例?
我认为产品类一定不知道折扣创建过程,它应该只使用折扣。因此,我的建议是创建一个带有 Map 的折扣工厂,该 Map 将保存不同的折扣实现:
class DiscountFactory {
private static final Map<String, DiscountStrategy> strategies = new HashMap<>();
private static final DiscountStrategy DEFAULT_STRATEGY = () -> 0;
static {
strategies.put("code1", () -> 10);
strategies.put("code2", () -> 20);
}
public DiscountStrategy getDiscountStrategy(String priceCode) {
if (!strategies.containsKey(priceCode)) {
return DEFAULT_STRATEGY;
}
return strategies.get(priceCode);
}
}
之后,Product类可以简化:
class Product {
private DiscountStrategy discountStrategy;
Product(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public int getDiscount() {
return discountStrategy.getDiscount();
}
}
函数式接口将允许您使用 lambda 表达式创建不同的实现:
interface DiscountStrategy {
int getDiscount();
}
最后,使用产品和折扣的示例:
DiscountFactory factory = new DiscountFactory();
Product product = new Product(factory.getDiscountStrategy("code1"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)