一、策略模式简介
介绍
策略模式是一种行为设计模式,它能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。
应用场景:
- 1.多个相关类只区别在表现行为不同:当一个系统需要动态地在几种算法或行为中选择一种时。
- 2.避免使用多重条件选择语句(如if-else或switch-case):如果在一个系统中有很多条件判断语句,可以通过将这些判断分支封装成不同的策略类来避免代码的复杂性。
- 3.可互换的算法:程序需要支持多种算法,并且这些算法可以在运行时互换。
为什么使用策略模式?
- 提高灵活性:通过将算法封装在独立的类中,可以轻松地添加、移除或修改算法,而无需修改使用它们的类。
- 易于扩展:增加新的策略只需实现接口即可,符合开闭原则。
- 简化复杂逻辑:将复杂的条件判断逻辑分散到各个策略类中,使得主逻辑更加清。
二、设计思想和代码实现
设计思想:
- step1.编写父类策略接口,定义行为方法。
- step2.根据需要编写N个具体的策略接口的实现类。
- step3.初始化 实现类到容器中(一般IOC容器)。
- step4.在应用时根据标识符从容器中获取对应的处理器实例处理业务接口。
Java代码:
java
// 如果不使用策略模式则需要类似如下写多个if ... else 代码,比较复杂,不容扩展,代码复用性低
doPremium(Vo vo){
if(vo.getCheckRule == 0){
//3000
} else if(vo.getCheckRule == 1){
// 5000
} else if(vo.getCheckRule == 2){
// 5000
} ...
示例:
在线购物平台,需要根据用户的不同会员等级提供不同的折扣策略。这里就可以使用策略模式来设计。
在使用的时候;亮出会员等级和购买商品的价格就可以得到这个等级对应的购买价格。
1)step1定义策略接口:
java
package com.it.shop;
public interface DiscountStrategy {
double calculate(double price);
}
2)step2.实现策略类:
普通会员折扣类 com.it.shop.NormalMemberDiscount
java
package com.it.shop;
public class NormalMemberDiscount implements DiscountStrategy{
@Override
public double calculate(double price) {
//普通会员折扣
return price * 0.95;
}
}
银牌会员折扣类 com.it.shop.SilverMemberDiscount
金牌会员折扣类 com.it.shop.GoldMemberDiscount
java
package com.it.shop;
public class GoldMemberDiscount implements DiscountStrategy{
@Override
public double calculate(double price) {
//金牌会员折扣
return price * 0.85;
}
}
可扩展性,可维护性很强;比如需要添加ssvip会员,更优惠。
添加,ssvip更优惠;
@service 注册到IOC容器;前端传和bean一样的名称;
3)step3.策略工厂(初始化):
4)step4.应用策略:
java
public static void main(String[] args) {
while(true) {
//system.out.println("请输入价格:");
System.out.println("请输入会员等级:");
Scanner scanner = new Scanner(System.in);
String memberLevel = scanner.nextLine();
System.out.println("请输入商品价格:");
double price = scanner.nextDouble();
//根据传递的会员等级, 找到处理这个类型的处理类;
//可扩展性,可维护性很强;
DiscountStrategy discountStrategy = strategyMap.get(memberLevel);
double discountprice = discountStrategy.calculate(price);
System.out.println("会员等级为:"+memberLevel+",商品价格为:"+price+",会员折扣价格为:"+discountStrategy.calculate(price));
}
}