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

原创 2004年09月16日 23:23:00

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

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

从上述销售部提出的计划可以看出,这一销售措施和商品的价格无关,如果有人说我们可以通过增加一个商品打折价格来实现这个功能的话,我肯定不同意这一说法(由于现在我是项目负责人,所以否决了该设计方案)。而我的思路是这样的,在用户选择好商品之后,进行结账(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 网站转载请注明作者 其他转载方式请与作者联系(idilent@yahoo.com.cn)。

商品销售打折自定义的数据建模

  近期看了idilent的文章《使用面向对象技术解决商品打折问题》,文后有读者提出要求:如果不同商品的折扣不同怎么办? 或者有买一百送五十这种方式,或不同会员等级的折扣不同。 怎么处理?”idile...
  • comiunknown
  • comiunknown
  • 2004年09月27日 15:46
  • 2969

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

我们现在看在checkout方法中究竟要使用要使用CodePromotion这个类提供的那些信息,首先可以肯定,getPromotionAmount这个方法是必需的,而且我们希望能够得知某一定但为什么...
  • idilent
  • idilent
  • 2004年09月18日 23:09
  • 1287

商品打折问题

#include #include #include using namespace std; int main() { cout
  • qq_18343569
  • qq_18343569
  • 2015年09月16日 21:33
  • 256

Java封装商场打折策略(Strategy模式)

有了OO的基础后,开始认真学习设计模式。 首先学习的是Strategy,下面就封装商场打折策略来分析下策略模式是怎样一回事。 商场每逢节假日都会对不同的商品采用不同的打折策略,首先卖苹果的说我的苹...
  • dyllove98
  • dyllove98
  • 2013年04月25日 20:44
  • 4511

商品打折

*商场商品打折。消费在400元以上打9折,800元以上打8折。1000元以上打7.5折。消费金额可分次累计。如果把“消费”定义为一个类,那么每次消费都可以定义为一个对象···可是因为可以打折,两次消费...
  • du51
  • du51
  • 2005年04月15日 11:21
  • 636

商品打折管理信息系统 使用C#开发,使用软件是visual studio 2017

使用C#开发,使用软件是visual studio 2017## 标题 ## 做的比较简单。 下图左边程序主界面,右边是各个页面的代码。 主程序入口代码:using System; usin...
  • qq_18049105
  • qq_18049105
  • 2017年11月09日 15:54
  • 302

【设计模式】策略模式——以商场促销为例

本文内容参考自《大话设计模式》(程杰 著) 注:以下代码为java实现版本1需求:做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。关键代码:public class Cash {...
  • jiange_zh
  • jiange_zh
  • 2015年12月04日 14:25
  • 2087

Android textView设置横线,用于商品原价,特价效果的实现

textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线 textview.getPaint().setFlags(Pa...
  • qq939782569
  • qq939782569
  • 2017年02月19日 17:44
  • 316

MATLAB程序设计教程(3)——MATLAB程序设计

第3章  MATLAB程序设计3.1  M文件3.2  程序控制结构3.3 函数文件3.4 程序举例3.5 程序调试 3.1  M文件3.1.1  M文件概述    用MATLAB语言编写的程序,称为...
  • ysuncn
  • ysuncn
  • 2007年08月13日 23:42
  • 7236

转《商品销售打折自定义的数据建模》

转《商品销售打折自定义的数据建模》  近期看了idilent的文章《使用面向对象技术解决商品打折问题》,文后有读者提出要求:如果不同商品的折扣不同怎么办? 或者有买一百送五十这种方式,或不同会员等级的...
  • falconshh
  • falconshh
  • 2005年03月16日 11:08
  • 761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用面向对象技术解决商品打折问题(一)
举报原因:
原因补充:

(最多只允许输入30个字)