策略模式-通俗易懂的理解



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()。


    推荐阅读