优点
②策略模式提供了对开闭原则的完美支持,可以在不修改源代码的情况下,灵活增加新算法。
③策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
缺点
①客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。
②策略模式造成很多的策略类,增加维护难度。
import java.util.Objects;
public class StrategyDemo {
/**
* 抽象策略角色
*/
interface DiscountStrategy{
String discount();
}
/**
* 优惠券抵扣策略类
*/
static class CouponStrategy implements DiscountStrategy{
@Override
public String discount() {
System.out.println("使用优惠券抵扣");
return "coupon";
}
}
/**
* 返现促销策略类
*/
static class CashBackStrategy implements DiscountStrategy{
@Override
public String discount() {
System.out.println("返现,直接打款到支付宝账号");
return "cashBack";
}
}
/**
* 拼团优惠策略类
*/
static class GroupBuyStrategy implements DiscountStrategy{
@Override
public String discount() {
System.out.println("5人成团,可以优惠");
return "groupBuy";
}
}
/**
* 无优惠策略类
*/
static class EmptyStrategy implements DiscountStrategy{
@Override
public String discount() {
System.out.println("无优惠");
return "empty";
}
}
/**
* 促销活动方案类
*/
static class PromotionContext{
private DiscountStrategy strategy;
public PromotionContext(DiscountStrategy strategy){
this.strategy = strategy;
}
public String execute(){
return strategy.discount();
}
}
public static void main(String[] args){
PromotionContext activity = null;
String promotionKey = "COUPON";
if(Objects.equals(promotionKey, "COUPON")){
activity = new PromotionContext(new CouponStrategy());
}else if(Objects.equals(promotionKey, "CASHBACK")){
activity = new PromotionContext(new CashBackStrategy());
}else if(Objects.equals(promotionKey, "GROUPBUY")){
activity = new PromotionContext(new CashBackStrategy());
} else {
activity = new PromotionContext(new EmptyStrategy());
}
activity.execute();
}
}
策略模式demo
于 2022-06-30 07:35:37 首次发布
本文探讨了策略模式如何通过提供算法的可扩展性来支持开闭原则,同时指出了客户端理解和选择策略的复杂性以及维护策略类可能带来的困难。
2万+

被折叠的 条评论
为什么被折叠?



