一、商场营销-策略模式
背景:如何去实现一个商场的收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。
初步分析:用两个文本框来输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,还需要一个重置的按钮来重新开始。
二、商场收银系统v1.0的代码如下:
三、需求改变
1、如果现在要求商场对商品搞活动,所有的商品要打八折。
A、然后有人会想那不就是在上面的totalPrices后面乘以一个0.8吗?
但是仔细想一想,难道商场活动结束,不打折了,你还要再改一遍程序代码,然后再用改后的程序去把所有机器全部安装一次吗?再说了,以后还可能有周年庆,打五折的时候,该怎么办?
所以说改这个需求的应该加一个下拉选择框就可以解决你说的问题
2、修改的代码如下:
四、新的需求
1、在上面的代码中,4个分支的代码中除了打折多少以外几乎没有什么不同,应该考虑重构一下,不过这个不是主要的。
2、但是现在的新的需求是如果商场的活动加大,需要有满300返100的促销算法,你说怎么办呢?
3、这时,如果有人看我写的第一篇设计模式的话,就会有人想到用简单工厂的设计模式,但是随着类越来越多的话,这时要几个活动就会写几个活动的类。
4、这时应该看哪些是相同的,哪些是不同的。
思考:这里的打折基本是一样的,只要有个初始化参数就可以了,满几送几,需要两个参数就可以了。
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。
五、代码实现如下:
六、对于上面的代码改造之后的优点
1、对于上面的方式,如果需要新加一个打五折和满500送200的促销活动,如何办?
2、只需要在工厂中加了两个条件就可以了。
3、如果加一个促销手段呢?比如,满100积分10点呢?以后积分到一定的时间才可以领取奖品如何做呢?
4、这时学完上面的方案大家可以想到,只要加一个积分算法,然后在构造方法里面有两个参数:条件和返点,让它继承CashSuper类就好了,然后在工厂类里面的分支下加条件。再到界面上改造下就可以了。
七、对于上面的代码改造之后的缺点
1、简单工厂模式只能解决了对象的创建的问题,而且由于工厂本身包括了所有的收费方式。
2、商场的收费方式可能会经常变化的,每次维护或者扩展收费方式都要改动这个工厂,然后重新编译和部署是很麻烦的。所以不是最好的解决办法。
下回解决~,今天先到这了,明天见~~~