策略模式是对算法的封装,让算法可以互相替换,算法的替换不影响客户端的使用
比如以商场折扣的为例,可能是打折,也有可能是返现,我们要封装算法进行互相替换
抽象的策略类
package com.lizhenbo.strategy;
/**
* 抽象的算法策略,所有的具体算法都必须继承该抽象类
* @author LIZHENBO
*/
public abstract class PriceStrategy {
public abstract double getPrice(double totalPrice);
}
正常收费的算法策略
package com.lizhenbo.strategy;
/**
* 正常收费的算法类
* @author LIZHENBO
*
*/
public class PriceNormal extends PriceStrategy {
@Override
public double getPrice(double totalPrice) {
return totalPrice;
}
}
打折收费的算法策略
package com.lizhenbo.strategy;
/**
* 打折收费的算法类
* @author LIZHENBO
*
*/
public class PriceDiscount extends PriceStrategy {
@Override
public double getPrice(double totalPrice) {
return totalPrice*0.8;
}
}
返现收费的算法策略
package com.lizhenbo.strategy;
/**
* 返现收费的算法类
* @author LIZHENBO
*
*/
public class PriceReturn extends PriceStrategy {
@Override
public double getPrice(double totalPrice) {
if(totalPrice>=100){
totalPrice=totalPrice-20;
}
return totalPrice;
}
}
维持有一个算法策略
package com.lizhenbo.strategy;
/**
* 维持有一个算法策略
* @author LIZHENBO
*/
public class PriceContext {
//维持有一个算法策略
private PriceStrategy priceStrategy;
//在构造方法中,初始化算法策略
public PriceContext(PriceStrategy priceStrategy){
this.priceStrategy=priceStrategy;
}
//使用算法策略
public double getprice(double totalPrice){
return priceStrategy.getPrice(totalPrice);
}
}
测试类
package com.lizhenbo.strategy;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//总价格
double totalPrice=100;
//定义一个返现的算法策略
PriceStrategy priceStrategy=new PriceReturn();
//传入算法策略
PriceContext priceContext=new PriceContext(priceStrategy);
//计算折扣后的价格
double getprice = priceContext.getprice(totalPrice);
//输出
System.out.println("折扣后的价格是:"+getprice);
}
}
输出结果:
折扣后的价格是:80.0