23种设计模式(二)---策略设计模式 (2)

使用策略设计模式会产生很多具体策略类, 客户端每次只能使用一个策略类,不支持使用一个策略类完成部分功能后再使用另一个策略类来完成剩余功能的情况。

所有的策略类需要对外暴露. 因为客户端只有知道有哪些策略, 才知道应该是用哪个.这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

4. 使用场景

1、一个系统, 需要动态的在几个算法之间选择, 它们之间的区别仅仅是算法或者行为的不同,那么可以使用策略模式, 这样我们可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、一个对象有很多的行为,如果不用策略设计模式,这些行为就只好使用多重条件选择语句来实现。而使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句。

5. 注意事项

如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

四. 策略设计模式结合工厂设计模式的应用

上面的商场促销活动. 最终策略都要暴露给客户端, 这对客户端来说不是特别友好. 我们可以结合简单工厂设计模式, 将策略进行封装.

package com.lxl.; import org.springframework.beans.factory.annotation.Autowired; /** * 商场促销 */ public class MallPromotionContext { @Autowired private IPromotionStrategy promotion; public MallPromotionContext(IPromotionStrategy promotion) { this.promotion = promotion; } public MallPromotionContext(Integer type) { switch (type) { case 1: this.promotion = new CommonPromotionStrategy(); break; case 2: this.promotion = new DiscountPromotionStrategy(); break; case 3: this.promotion = new FullReductionPromotionStrategy(); break; } } public Double activityPromotion(PromotionVo promotionVo) throws Exception { return this.promotion.promotion(promotionVo); } }

这样封装以后的好处就是, 客户端只需要知道自己要什么类型的促销策略, 而不用关注具体促销策略类型.
下面来看一下策略代码的实现

public static void main(String[] args) throws Exception { PromotionVo promotionVo = new PromotionVo(300.0, 0.8, 100.0, 30.0); System.out.println("<br><br>==========正常售卖========="); MallPromotionContext mallPromotionContext1 = new MallPromotionContext(1); System.out.println(mallPromotionContext1.activityPromotion(promotionVo)); System.out.println("<br><br>==========8折========="); MallPromotionContext mallPromotionContext2 = new MallPromotionContext(2); System.out.println(mallPromotionContext2.activityPromotion(promotionVo)); System.out.println("<br><br>==========满100减30========="); MallPromotionContext mallPromotionContext3 = new MallPromotionContext(3); System.out.println(mallPromotionContext3.activityPromotion(promotionVo)); }

在基本的策略设计模式中, 选择所用具体实现的职责有客户端对象承担, 并转给策略模式的Context对象, 并没有减轻客户端需要选择判断的压力.而策略设计模式与简单工厂设计模式的结合, 选择具体实现的则在有也由Context来承担, 这就大大的减轻了客户端的职责.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdzdz.html