策略模式:是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。
这个模式涉及到三个角色:
1、环境(Price)角色:持有一个Strategy的引用;
2、抽象策略(MemberStrategy)角色:这是一个抽象角色,通常有一个接口或者抽象类实现。此角色给出所有的具体策略类所需的接口。
3、具体策略(PrimaryMemberStrategy、IntermediateMemberStrategy、AdvancedMemberStrategy)角色:包装了相关的算法或者行为。
使用场景
针对不同会员等级提供促销折扣:
算法一:对初级会员没有折扣。
算法二:对中级会员提供10%的促销折扣。
算法三:对高级会员提供20%的促销折扣。
源代码:
/**
* 抽象接口类
*/
public interface MemberStrategy {
/**
* 计算图书的价格
*
* @param booksPrice 图书的原价
* @return 计算出打折后的价格
*/
double calcPrice(
double booksPrice);
}
/**
* 初级会员策略算法类
*/
public class PrimaryMemberStrategy
implements MemberStrategy {
@Override
public double calcPrice(
double booksPrice) {
System.out.println("对于初级会员的没有折扣"
);
return booksPrice;
}
}
/**
* 中级会员策略算法类
*/
public class IntermediateMemberStrategy
implements MemberStrategy {
@Override
public double calcPrice(
double booksPrice) {
System.out.println("对于中级会员的折扣为10%"
);
return booksPrice * 0.9
;
}
}
/**
* 高级会员策略算法类
*/
public class AdvancedMemberStrategy
implements MemberStrategy {
@Override
public double calcPrice(
double booksPrice) {
System.out.println("对于高级会员的折扣为20%"
);
return booksPrice * 0.8
;
}
}
/**
* 持有策略对象的价格类
*/
public class Price {
//持有一个具体的策略对象
private MemberStrategy memberStrategy;
/**
* 构造函数,传入一个具体的策略对象
*
* @param memberStrategy 具体的策略对象
*/
public Price(MemberStrategy memberStrategy) {
this.memberStrategy =
memberStrategy;
}
/**
* 计算图书价格
*
* @param booksPrice 图书原价
* @return 计算出打折后的价格
*/
public double quote(
double booksPrice) {
return this.memberStrategy.calcPrice(booksPrice);
}
}
/**
* 对高级会员进行使用策略方案
*/
public class StrategyMain {
public static void main(String[] args) {
//选择并创建需要使用的策略对象
MemberStrategy memberStrategy =
new AdvancedMemberStrategy();
//将策略对象放入需要具体策略的类
Price price =
new Price(memberStrategy);
//计算价格
double quote = price.quote(300
);
System.out.println("图书的最终价格为:" +
quote);
}
}
运行结果: