策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。
策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。
一句话来形容:准备一组算法,并将每一个算法封装起来,使得他们可以互换。
- public interface Zhekou {
- /**
- * 计算图书的价格
- * @param booksPrice 图书的原价
- * @return 计算出打折后的价格
- */
- public double calcPrice(double booksPrice);
- }
-
- public class Chujihuiyuan implements Zhekou{
- public double calcPrice(double booksPrice) {
- // TODO Auto-generated method stub
- System.out.println("对于初级会员的没有折扣");
- return booksPrice;
- }
- }
-
- public class Zhongjihuiyuan implements Zhekou{
- public double calcPrice(double booksPrice) {
- // TODO Auto-generated method stub
- System.out.println("对于中级会员的折扣为10%");
- return booksPrice * 0.9;
- }
- }
-
- public class Gaojihuiyuan implements Zhekou{
- public double calcPrice(double booksPrice) {
- // TODO Auto-generated method stub
- System.out.println("对于高级会员的折扣为20%");
- return booksPrice * 0.8;
- }
- }
-
- public class Jiage {
- //持有一个具体的策略对象
- private Zhekou strategy;
- /**
- * 构造函数,传入一个具体的策略对象
- * @param strategy 具体的策略对象
- */
- public Jiage(Zhekou strategy){
- this.strategy = strategy;
- }
- /* 计算图书的价格
- @param booksPrice 图书的原价
- @return 计算出打折后的价格
- */
- public double quote(double booksPrice){
- return this.strategy.calcPrice(booksPrice);
- }
- }
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- //选择并创建需要使用的策略对象
- Zhekou strategy = new Gaojihuiyuan();
- //创建环境
- Jiage price = new Jiage(strategy);
- //计算价格
- double quote = price.quote(300);
- System.out.println("图书的最终价格为:" + quote);
- }
问题:假设现在要设计一个贩卖各类书籍的电子商务的购物车系统
一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。比如:本网站可能对所有的教材类的图书实行每本一元的折扣;对连环画类图书提供7%的促销折扣,而对非教材类的计算机图书有3%的折扣;对其余的图书没有折扣。由于有这样复杂的折扣算法,使得价格计算问题需要系统得解决。
使用策略模式描述的话,这些不同的算法都是不同的具体策略角色,用一个NoDiscountStrategy对象描述”算法一”;用一个FlatRateStrategy对象描述”算法二”;用一个PercentageStrategy对象描述”算法三”;
为了定义出算法的等级结构。需要一个抽象策略角色作为等级结构的超类型。这个抽象策略角色由一个Java抽象类DiscountStrategy扮演
优点:
1.提供了管理相关的算法族的办法。
2.提供了可以替换继承关系的办法。
3.避免使用多重条件转移语句
缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.造成很多的策略类。