OO design trap

需求如下:
有这样一家超市,对顾客实行会员制,会员目前分为两个等级:金卡及银卡。
每次会员购物时,都会根据会员等级提供不同的折扣优惠和返点。

设计方案有三个:
1. 过程设计,用作对比
2. 过程式的OO设计,简单来说就是将过程设计中的函数封装到类里面
3. 标准的OO设计,封装、继承、多态、设计模式,能用的都用上

问题:
如果是你,你会采用哪种OO设计,或者有更好的设计?


过程式设计:

Java代码  收藏代码
  1. // client:  
  2.   
  3. string id = input_id;  
  4.   
  5. string type = GetMemberTypeByID();;  
  6.   
  7. int discount = GetDiscountByType(type);;  
  8. int point = GetReturnPoint(type);;  
  9.   
  10.   
  11. // service:  
  12.   
  13. string GetMemberTypeByID(string id);  
  14. {  
  15.     string type;  
  16.       
  17.     // get type by id  
  18.     ...  
  19.       
  20.     return type;  
  21. }  
  22.   
  23. int GetDiscount(string type);  
  24. {  
  25.     switch(type);  
  26.     {  
  27.         case "金卡":  
  28.             return 10;  
  29.               
  30.         case "银卡"  
  31.             return 5;  
  32.     }  
  33.       
  34.     return 0;  
  35. }  
  36.   
  37. int GetReturnPoint(string type);  
  38. {  
  39.     switch(type);  
  40.     {  
  41.         case "金卡":  
  42.             return 1.5;  
  43.               
  44.         case "银卡"  
  45.             return 1;  
  46.     }  
  47.       
  48.     return 0;  
  49. }  



OO设计1(仅使用封装特性)

Java代码  收藏代码
  1. // client:  
  2.   
  3. string id = input_id;  
  4.   
  5. Member member = new Member(id);;  
  6.   
  7. int discount = member.GetDiscount();;  
  8. int point = member.GetReturnPoint();;  
  9.   
  10. // service:  
  11.   
  12. class Member  
  13. {  
  14.     string type;  
  15.   
  16.     public Member(string id);  
  17.     {  
  18.         type = GetMemberTypeByID(id);;  
  19.     }  
  20.       
  21.     protected string GetMemberTypeByID(id);  
  22.     {  
  23.         string type;  
  24.       
  25.         // get type by id  
  26.         ...  
  27.       
  28.       
  29.         return type;      
  30.     }  
  31.       
  32.     public int GetDiscount();  
  33.     {  
  34.         switch(type);  
  35.         {  
  36.             case "金卡":  
  37.                 return 10;  
  38.                   
  39.             case "银卡"  
  40.                 return 5;  
  41.         }  
  42.           
  43.         return 0;  
  44.     }  
  45.   
  46.     public int GetReturnPoint();  
  47.     {  
  48.         switch(type);  
  49.         {  
  50.             case "金卡":  
  51.                 return 1.5;  
  52.                   
  53.             case "银卡"  
  54.                 return 1;  
  55.         }  
  56.           
  57.         return 0;  
  58.     }  
  59. }  


 

严重声明:本文版权属原作者所有    本文重在收藏和学习

 

原文地址:http://www.iteye.com/topic/17714

posted @ 2011-11-25 18:43  永哥  阅读(193)  评论(0编辑  收藏  举报