java 策略模式(大话设计模式)
发布日期:2021-05-19 21:35:50 浏览次数:20 分类:精选文章

本文共 2311 字,大约阅读时间需要 7 分钟。

策略模式下,我们定义了一个统一的接口,然后每个具体的算法都实现这个接口。通过上下文类来决定使用哪个具体的策略。这种设计使得算法的变化不会影响到使用算法的客户端。

现金收费项目是一个很好的例子。我们定义了一个CashSuper的抽象接口,具体策略包括CashNormal(正常收费)、CashRebate(打折收费)和CashReturn(满满扣扣收费)。

每个具体策略都实现了相同的接口,但具体实现方式不同。例如:

public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
public class CashRebate extends CashSuper {
private double moneyRebate = 1.0;
public CashRebate(String moneyRebate) {
this.moneyRebate = Double.parseDouble(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
public class CashReturn extends CashSuper {
private double moneyCondition = 1.0;
private double moneyReturn = 1.0;
public CashReturn(String moneyCondition, String moneyReturn) {
this.moneyCondition = Double.parseDouble(moneyCondition);
this.moneyReturn = Double.parseDouble(moneyReturn);
}
@Override
public double acceptCash(double money) {
double result = money;
if (money >= moneyCondition) {
result = money - Math.floor(money / moneyCondition) * moneyReturn;
}
return result;
}
}

CashContext上下文类决定了使用哪个策略:

public class CashContext {
CashSuper cs = null;
public CashContext(String type) {
switch (type) {
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("300", "100");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}

客户端通过CashContext选择不同的策略:

public class CashClient {
public static void main(String[] args) {
CashContext context = new CashContext("正常收费");
double money0 = context.getResult(300);
System.out.println("正常收费: " + money0);
context = new CashContext("打8折");
double money1 = context.getResult(300);
System.out.println("打8折: " + money1);
context = new CashContext("满300返100");
double money2 = context.getResult(300);
System.out.println("满300返100: " + money2);
}
}

这种设计方式使得算法的变化可以通过简单地更换策略实现,从而提升系统的灵活性和扩展性。

上一篇:java 装饰模式(大话设计模式)
下一篇:java 代理模式

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月11日 10时49分04秒