策略模式:是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。
这个模式涉及到三个角色:
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); } }
运行结果: