设计模式之策略模式

87 阅读2分钟

策略模式

策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种行为型模式《设计模式的艺术》

使用场景

策略模式常用于解决某一个问题,或者是实现某个功能时会存在多种实现方法,因而将每个方法进行一定的封装,由使用者决定使用哪种方法。

策略模式示例

策略模式实现:

/**
 * @author 慕文
 */
public class Price {
    /**
     * 这个方法是根据身份控制逻辑流程的那个方法
     * 这个方法在这个类中没有动
     */
    public double quote(double goodsPrice,Strategy strategy){
        double result = 0;
        System.out.println("同学,决定好好学习了吗");
        //执行一个计算的方法啦(具体是哪个方法(计算策略) 不知道 有参数决定)
        result = strategy.calculatePrice(goodsPrice);
        System.out.println("报价完成,希望坚持学习,祝同学们学业有成");
        return result;
    }
}

/**
 * 定义一个规则
 * 未来具体的方法(计算策略)实现这个规则
 * @author 慕文
 */
public interface Strategy {
    /**
     * 负责计算(具体怎么计算 不知道 使用抽象方法)
     * @param goodsPrice
     * @return
     */
    double calculatePrice(double goodsPrice);
}
/**
 * @author 慕文
 */
public class CustomerFriend implements Strategy {
    @Override
    public double calculatePrice(double goodsPrice) {
        System.out.println("是朋友推荐过来的顾客 必须有优惠啊");
        return goodsPrice - 3999;
    }
}
/**
 * @author 慕文
 */
public class CustomerNormal implements Strategy {
    @Override
    public double calculatePrice(double goodsPrice) {
        System.out.println("就是一个普通用户 没有优惠哦");
        return goodsPrice;
    }
}
/**
 * @author 慕文
 */
public class TestMain {
    public static void main(String[] args) {
        Price price = new Price();
        CustomerNormal customerNormal = new CustomerNormal();
        CustomerFriend customerFriend = new CustomerFriend();
        price.quote(11199,customerFriend);
        price.quote(11199,customerNormal);

    }
}

优缺点分析

优点: 1、策略模式完美体现类开闭原则,扩展性非常好。 2、使用策略模式与状态模式有个共同有点,避免大量判断逻辑代码;

缺点: 1、客户端需要知道所有策略类,自行决定使用哪一种策略; 2、当有新策略产生时需要增加一个策略类,导致系统的类会越来复杂;