策略模式与简单工厂的实现
简单工厂模式我需要让客户端认识两个类,CashSuper和CashFactory,而策略模式与简单工厂结合的用法,客户端就只需要认识一个类CashContext就可以了。耦合更加降低。
代码实现
定义一个Strategy算法接口:
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public interface Strategy {
public double algorithm(double money);
}
创建实现Strategy接口的实现类:
/**
* 普通算法
* @ author 黄栋
* @ create 2021/10/20
*/
public class ConcreteStrategyA implements Strategy {
@Override
public double algorithm(double money) {
//返回原价
return money;
}
}
/**
* 满多少减多少算法
* @ author 黄栋
* @ create 2021/10/20
*/
@SuppressWarnings("all")
public class ConcreteStrategyB implements Strategy {
private double moneyOne;//满多少
private double moneyTwo;//减多少
public ConcreteStrategyB(double moneyOne,double moneyTwo){
this.moneyOne=moneyOne;
this.moneyTwo=moneyTwo;
}
@Override
public double algorithm(double money) {
if(money>=moneyOne){
money=money-moneyTwo;
}
return money;
}
}
/**
* 折扣算法
* @ author 黄栋
* @ create 2021/10/20
*/
@SuppressWarnings("all")
public class ConcreteStrategyC implements Strategy {
//折扣
private double moneyRebate;
public ConcreteStrategyC(double moneyRebate){
this.moneyRebate=moneyRebate;
}
@Override
public double algorithm(double money) {
return money*moneyRebate;
}
}
创建Context 类://其实就是改造了Context类将测试类的判断移到了Context类中
/**
* @ author 黄栋
* @ create 2021/10/20
*/
public class Context {
//算法接口
private Strategy strategy;
//初始化时,传入具体的策略对象
public Context(String type){
switch (type){
case "正常收费":
strategy=new ConcreteStrategyA();
break;
case "满500返100":
strategy=new ConcreteStrategyB(500,100);
break;
case "打6折":
strategy=new ConcreteStrategyC(0.6);
break;
}
}
//根据具体的策略对象,调用其算法的方法
public double algorithm(double money){
return strategy.algorithm(money);
}
}
创建测试类:
/**
* @ author 黄栋
* @ create 2021/10/20
*/
@SuppressWarnings("all")//镇压警告
public class Test {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.print("请输入算法模式:");
String type = in.next();
CashContext context =new CashContext(type);
double algorithm = context.algorithm(999*2);//2为数量,999为单价
System.out.println("结果:"+algorithm);
}
}
运行结果:
请输入算法模式:打6折
结果:1198.8