策略模式
策略模式(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、当有新策略产生时需要增加一个策略类,导致系统的类会越来复杂;