只听名字总没有什么头绪,什么策略?
情景: 超市活动,有满减,有打折,有正常收费,求 不同情况下的付款额。
①创建 付款基类抽象类,有一个抽象方法apply用于计算活动后实际付款额
//付款 基类
public abstract class CashSuper {
//计算付款额
public abstract double apply(double money);
}
② 创建正常付费、打折付费、满减付费 三种付费方式类,分别继承付费基类。各自重写自己的apply方法。
// 满A返现(B) 方式
public class CashReturn extends CashSuper {
private double A;
private double B;
public CashReturn(String a, String b) {
super();
A = Double.valueOf(a.toString());
B = Double.valueOf(b.toString());
}
@Override
public double apply(double money) {
if(money >= A){
return money - B;
}else{
return money;
}
}
}
package num02_策略模式;
// 打折方式 付费
public class CashRebate extends CashSuper {
private double zhekou;// 打几折
public CashRebate(String zhekou){
this.zhekou = Double.valueOf(zhekou.toString());
}
@Override
public double apply(double money) {
return money * zhekou;
}
}
package num02_策略模式;
//正常付费无活动 付款方式类
public class CashNormal extends CashSuper{
@Override
public double apply(double money) {
return money;
}
}
③创建付费工厂类,用于根据不同的情景创建不同付款方式的 具体类对象
package num02_策略模式;
//付款 工厂类,用于创建 不同付款方式 具体类对象
public class Context {
CashSuper cs;
//返现方式
public Context(String high,String low){
cs = new CashReturn(high,low);
}
public Context(String type) {
switch(type){
case "normal":
cs = new CashNormal();
break;
case "0.8": //这里直接写死,用于说明折扣问题即可。
cs = new CashRebate("0.8");
break;
}
}
//用于接受活动前初始金额,调用apply方法计算实际付款额
public double getResult(double money){
return cs.apply(money);
}
}
④ main方法测试:
package num02_策略模式;
public class Main {
public static void main(String[] args) {
Context context = new Context("normal");
double result = context.getResult(200);
System.out.println(result); // 正常付款 200.0
context = new Context("0.8");
double result2 = context.getResult(200);
System.out.println(result2); // 折扣付款 160.0
context = new Context("500","50"); //满500减50
double result3 = context.getResult(600);
System.out.println(result3); // 满减付款 550.0
double result4 = context.getResult(300);
System.out.println(result4); // 满减付款 300.0
}
}
策略模式:定义 了算法家族,分别封装起来,让他们之间可以互相替换。从而使算法的变化不会影响到使用算法的用户。算法本身只是一种策略,他是随时会变化的,比如超时又搞一个加多少元减多少元的活动,这是变化点。
就例子而言:不管打折还是返利,都是具体的付费算法。他们继承于抽象算法类CashSuper。在工厂类中有一个对CashSuper的引用,
利用多态在工厂类中创建具体付费方式对象。由于实例化不同的策略,所以最终在调用context.getResult时就会调用不同付费类的apply方法。
扫描二维码关注公众号,回复:
10875588 查看本文章
如果只用简单工厂模式,客户端需要认识CashSuper和Context两个类,现在采用策略模式结合简单工厂模式,只需要让客户端认识一个Context类即可,耦合度更加降低了【策略模式减少了 定义算法类 与 使用算法类 之间的耦合】。
ps:面向对象编程并不是类越多越好,类的划分是为了封装,但是分类的基础是抽象,具有相同属性和功能的对象的抽象集合 才是 类。