使用面向对象技术解决商品打折问题

类别:Java 点击:0 评论:0 推荐:

在现实中,商品打折是一个非常普遍的现象,在这里,我们抛开打折背后的各种动机和目的,来分析如何在我们的程序中实现这个过程,并且通过面向对象的技术,使得我们的系统更灵活,更具有可扩展性,为以后的维护和升级工作打好基础。

首先介绍一下我们目前使用的系统的简单情况,这是一个网上购物系统,销售人员为提高销售额,决定为每一个购买用户提供一个打折号码,这样,这个用户在下次购买我们的产品时,就可以通过这个打折好码得到一定的优惠,同时为了扩展我们的销售范围,这个打折号码任何人都可以使用。听起来好像很有诱惑力,但是我们在这里不是讨论该销售计划是否可行(这个是由上层决定的),而是如何在我们的现有的系统上增加这一功能。

从上述销售部提出的计划可以看出,这一销售措施和商品的价格无关,如果有人说我们可以通过增加一个商品打折价格来实现这个功能的话,我肯定不同意这一说法(由于现在我是项目负责人,所以否决了该设计方案)。而我的思路是这样的,在用户选择好商品之后,进行结账(checkout)时,可以选择输入打折号码(promotion code),然后系统对这个号码进行验证(是否我们提供的号码,是否过期等),如果这个号码符合要求,则在购买的商品总额中扣除折扣部分。

听起来很容易实现这一功能,我们只需要在纪录订单的方法中(这个方法的名字叫做checkout,以后要经常提及),增加一个打折号码的变量,然后进行验证,根据验证结果得出是否打折,打多折。然后把这些信息同购物信息一起记录到数据库中。

如果这样做的话,我们只需在上面提到的checkout方法的参数中增加一个promotionCode变量,然后在checkout方法中实现验证,计算折扣等功能,如果我们发现checkout的代码过于长的话,我们还可以把这一部分放到一个单独的方法中,使我们的代码看起来更容易让人接受。但是如果我们从面向对象的角度考虑的话,我们会发现,打折这一部分完全应该与结算分离,这样才保证了其中的封装性,就好比我们在超市购物,我们手中有一张打折卡,收银机处理checkout,但是它和打折卡完全是两部分,它需要知道卡的一些信息,但是其他的信息(如这张卡是如何来的)和收银机没有任何关系。也就是说,我们在设计的时候完全可以把打折部分设计成一个类,然后把这个类传递给checkout这个函数,从而利用面向对象的封装性使得打折部分成为一个独立的黑匣子。

下面就是关于打折的代码,在这里我只写出这个类的方法的定义部分,具体实现因为各自的系统不同也会有一些差异。
class CodePromotion{
 private String code;
 private Date expirationDate;
 private String description;
 
 //构造函数,根据用户输入的promotioncode,从数据库中得到相应的打折信息
 public CodePromotion(String promotionCode){}
 
 //得到打折部分的金额。
 public float getPromotionAmount(float totalCharge){}

 //验证promotioncode,被getPromotionAmount调用
 private boolean isValidate(){}

 //使用后对该code进行适当的处理
 public void use(){}

 //得到打折信息,一边记录到与订单有关的表中。
 public String getDescription(){}
 
 //得到一个新的打折号码。
 public static void newCodePromotion(){}
}


把这样的一个对象传递给checkout方法,我们就可以通过这个对象的getPromotionAmount取得打折后的价格,通过getDescription()得到打折的原因,并把这些信息在checkout方法中记录到数据库里面。这样,我们的确使用了面向对象的技术,把打折这部分企业逻辑很好的分离并封装,这样的代码相信要比前面提到的把promotioncode传递给checkout要好很多,但是我们并没有得到面向对象带给我们的所有优势。

也许有些人会问为什么我这样说,那么我们接着看我们公司的发展情况,该销售计划顺利的实施,而且取得了突出的成绩,销售部决定,开始不提供这一服务,那么我们完全可以在不改动程序的情况下实现这一举措,也就是不再提供新的promotion code。但是新的情况又出现了,我们公司老总说,现在online shopping成立1周年,取得良好的成果,为了扩大这个成果,公司决定,在一个月内的订单全部进行9折优惠。这样一来,如果我们按照上面的做法,就要重新写一个class,在checkout中再加入这个class,这样一来,checkout这个方法要根据公司政策的不断调整而不停的改变,我们手中也将会有大量的处理打折的类,我们也将陷入无休无止的修改checkout中,这是我们不愿意看到的事情。其实使用面向对象的技术完全可以避免这一结果的发生。(待续)

版权所有:idilent 网站转载请注明作者 其他转载方式请与作者联系([email protected])。

本文地址:http://com.8s8s.com/it/it15405.htm