与spring结合的策略模式

策略模式是23种设计模式之一,客户端通过制定多个算法并且封装,使得不同场景可以使用不同的策略算法。使得程序降低了耦合提高代码的复用性。接下来通过一个简单的实例来说明在实战中如何使用(即使是业务逻辑也是可以用设计模式的)。

例子很简单,就是通过同一个保存的service来做不同类型产品的保存。如下图:

用例图

接下来看具体实现:

BaseObj:

public abstract class BaseObj implements Serializable {
    private Integer id;
    private String goodsName;
    //省略getter,setter方法
    public abstract Byte getType();
}

DiscountGoods:

public class DiscountGoods extends BaseObj implements Serializable{

    private double discountRate;
    //省略getter,setter方法
    public Byte getType() {
        return 2;
    }

}

StrandardGoods:

public class StrandardGoods extends BaseObj implements Serializable{

    public Byte getType() {
        return 1;
    }

}

BaseSaveService:

public interface BaseService<T> {
    Boolean save(T obj);
}

StrandardGoodsService:

@Service
public StrandardGoodsService implements BaseSaveService<StrandardGoods>{
    public Boolean save(StrandardGoods goods){
        return this.saveStrandardGoods(goods);
    }
}

DiscountGoodsService:

@Service
public DiscountGoodsService implements BaseSaveService<DiscountGoods>{
    public Boolean save(DiscountGoodsgoods){
        return this.saveDiscountGoods(goods);
    }
}

StrategyContext:

public StrategyContext {
    prviate final Map<BaseObj,BaseSaveService> list=new ConcurrentHashMap<>();
     //使用spring注入所有实现了BaseSaveService接口的bean
     @Autowired
    public StrategyContext (List<BaseSaveService> beansOfType) {

        beansOfType.forEach(v -> list.put((BaseObj) v.getEntryInstance(), v));

    }

 public boolean save(BaseObj baseObj) {
        boolean flag = true;

        for (Map.Entry<BaseObj, BaseSaveService> entry : list.entrySet()) {
           //判断是否对应要保存的具体对象
            if (entry.getKey().getClass().isAssignableFrom(baseObj.getClass())) {
               flag = entry.getValue().save(baseObj);
            }
        }
        return flag;
    }
}

通过与spring结合,以后还会添加不同类型的goods保存只需要添加保存策略,也就是保存的service并不需要改变其他地方的代码就可完成保存。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值