美文网首页
设计模式 策略模式

设计模式 策略模式

作者: huisedediao | 来源:发表于2021-01-29 11:05 被阅读0次

    demo:design

    定义:定义一组算法,将他们封装起来,并让他们之间可以相互替换。



    讲道理光看文字是真的一脸懵逼。以下是自己的理解,如果有误欢迎指正。

    举个例子来理解:

    假设现在你开了一家服装店,有鞋子、衣服、裤子。鞋子衣服裤子都有新的和旧的,旧的要促销卖,新的不促销。并且,每种商品的促销策略可能不同,促销策略每周可能换一次,比如满减、打折、返现等等。过了一阵子,新的衣服快过季了,也要促销卖。该如何解决这个问题呢?

    解决方案1:

    有一个基类Goods,它里面有一个方法salesPromotion用于促销。所有商品都继承自它,重写salesPromotion方法。当某种商品的促销策略改变时,修改salesPromotion方法。

    思考以下问题:

    1,如果新增商品,并且是新的,不想要促销怎么办?只能重写该方法。
    2,新商品如果需要促销了怎么办?只能重写该方法。
    3,如果现在有这种情况,店铺要倒闭了,所有商品一律2折该怎么办呢?那就需要重写所有的类的salesPromotion方法。

    解决方案2:

    有一个接口类Sale,定义了一个接口sales用于促销。需要促销的商品实现该接口,不需要促销的商品不实现。
    这种方案解决了上面的第一个问题,新商品如果不促销,就不实现该接口。但是另外两个问题没有解决。

    解决方案3(使用策略模式):

    1,定义一个基类Goods,它里面有一个方法salesPromotion用于促销,所有商品都继承它。
    2,定义一个接口类Sale,其中有一个接口sales用于定义销售方式。
    3,根据销售方式的不同,新增几个不同的类来实现Sale的接口。比如OffSale(打折)、PresentSale(赠礼)、DefaultSale(无优惠)。
    4,在基类Goods中,增加一个成员变量sale,该成员变量为Sale类型,默认sale = new DefaultSale()。salesPromotion通过调用sale的sales实现促销。
    5,Goods的子类中的构造方法中,根据促销策略的不同,让sale指向不同类型的销售实例。比如旧衣服的sale = new OffSale(),旧裤子的sale = new PresentSale()等等。

    到此,我们看看上面的三个问题:

    第一个问题:解决了。

    第二个问题:在Goods中定义一个方法updateSale,用于更新sale指向。当新商品需要促销了,比如打折促销,就调用updateSale让sale = OffSale(),问题解决。

    第三个问题:有一种方案:有如果要倒闭了,把Sale所有实现类的sales都改成2折出售不就完事儿了。首先这种方案,不符合开闭原则。其次这种方案看似解决了问题,但是如果后面有投资,店又能继续经营了怎么办?再改回去吗?比较好的做法是和问题二的解决办法类似,新增一个Sale的实现类TwentyOff,所有商品都调用updateSale让sale = TwentyOff()。

    相关文章

      网友评论

          本文标题:设计模式 策略模式

          本文链接:https://www.haomeiwen.com/subject/hfcqtltx.html