一、背景
相信大家对商场会员制都很熟悉,超级vip会员打八折,普通会员打九折,不是会员不打折,如果用代码实现的话,以前会直接暴力地if 超级vip打八折 if 普通会员 打九折..,如果这样条件和算法行为紧密地放在一起,到后面维护起来就会比较麻烦。策略模式正好来解决这样的问题。
二、概念
策略模式是指对一系列的算法定义,并将各算法封装起来,相互之间可以替换。算法的变化独立于使用它的客户端。客户端只管调用算法,不关心具体细节。
三、代码实例
package strategyPattern;
/**
* 抽象策略接口
*
*/
interface Strategy {
public void caculatePrice(double price);
}
/**
* 超级vip
*
*/
class SuperVipCaculate implements Strategy {
@Override
public void caculatePrice(double price) {
System.out.println("SuperVip price:" + price * 0.8);
}
}
/**
* Vip
*
*/
class VipCaculate implements Strategy {
@Override
public void caculatePrice(double price) {
System.out.println("Vip price:" + price * 0.9);
}
}
/**
* 普通
*/
class NominalCaculate implements Strategy {
@Override
public void caculatePrice(double price) {
System.out.println("Nominal pirce:" + price);
}
}
/**
* 商场
*
*/
class Market {
private Strategy strategy;
public void caculatePrice(double price, String cusGrade) {
strategy = new NominalCaculate();
if ("superVip".equals(cusGrade)) {
strategy = new SuperVipCaculate();
}
if ("vip".equals(cusGrade)) {
strategy = new VipCaculate();
}
strategy.caculatePrice(price);
}
}
public class StrategyPatternCli {
public static void main(String[] args) {
Market market = new Market();
market.caculatePrice(100, "vip");
market.caculatePrice(100, "superVip");
market.caculatePrice(100, "");
}
}