第八次实验
打折的商品
老张的团队正在开发一个商场销售系统,需求中存在这样一段描述:
商品打折需求:
商场商品的打折存在两种场景,一个是消费到一定级别将得到白铁、青铜、白银和黄金四个VIP等级,当然普通消费者不同的消费级别也会有打折,其中打折算法如下:
- 普通消费者
- 消费区间(0-200],不打折
- (200-500]总价打折98%
- (500-1000]总价打折95%
- 1000+总价打折90%
- 白铁:
- 消费区间(0-200],总价打折98%
- (200-500]总价打折95%
- (500-1000]总价打折90%
- 1000+总价打折88%
- 青铜:
- 消费区间(0-200],总价打折95%
- (200-500]总价打折90%
- (500-1000]总价打折88%
- 1000+总价打折85%
- 白银:
- 消费区间(0-200],总价打折90%
- (200-500]总价打折88%
- (500-1000]总价打折85%
- 1000+总价打折80%
- 黄金:
- 消费区间(0-200],总价打折88%
- (200-500]总价打折85%
- (500-1000]总价打折80%
- 1000+总价打折75%
考虑到将来的销售情况,打折算法可能增加或减少,在已知打折区间不会变化的前提下,尝试给出相应的打折算法设计,并应对将来的算法数量扩充预做准备。
老张给出了测试代码和预期的输出以供参考:
public static void main(String[] args) {
Discount d=new DiscountNormal();
System.out.println("普通消费者");
System.out.printf("应收%.2f元\n",d.getPrice(188));//输出188元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(288));//输出288元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(588));//输出588元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(1088));//输出1088元打折结果
d=new DiscountIron();
System.out.println("白铁VIP");
System.out.printf("应收%.2f元\n",d.getPrice(188));//输出188元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(288));//输出288元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(588));//输出588元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(1088));//输出1088元打折结果
d=new DiscountBronze();
System.out.println("青铜VIP");
System.out.printf("应收%.2f元\n",d.getPrice(188));//输出188元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(288));//输出288元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(588));//输出588元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(1088));//输出1088元打折结果
d=new DiscountSilver();
System.out.println("白银VIP");
System.out.printf("应收%.2f元\n",d.getPrice(188));//输出188元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(288));//输出288元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(588));//输出588元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(1088));//输出1088元打折结果
d=new DiscountGold();
System.out.println("黄金VIP");
System.out.printf("应收%.2f元\n",d.getPrice(188));//输出188元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(288));//输出288元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(588));//输出588元打折结果
System.out.printf("应收%.2f元\n",d.getPrice(1088));//输出1088元打折结果
}
输出应为:
普通消费者
应收188.00元
应收282.24元
应收558.60元
应收979.20元
白铁VIP
应收184.24元
应收273.60元
应收529.20元
应收957.44元
青铜VIP
应收178.60元
应收259.20元
应收517.44元
应收924.80元
白银VIP
应收169.20元
应收253.44元
应收499.80元
应收870.40元
黄金VIP
应收165.44元
应收244.80元
应收470.40元
应收816.00元
聪明的排序器
排序可能应用在许多场景,老张的团队由于当前开发软件的需要,针对很多不同类型的数据都有排序的要求,手下的程序员们复制–>粘贴–>修改不断的重复,老张认为这是在累加无效的开发成本,于是希望设计一个聪明的排序器,老张先针对整型数据写出了初始的选择排序代码:
public void sort(int[] data) {
for(int i=0;i<data.length-1;i++) {
int pos=i;
for(int j=i+1;j<data.length;j++) {
if(data[j]>data[pos]) {
pos=j;
}
}
int t=data[i];
data[i]=data[pos];
data[pos]=t;
}
}
这段代码经过测试对整型数据实现是没有问题的,于是尝试针对一个模拟类尝试进行修改,这个类描述了某宠物管理系统中猫咪的信息:
当老张着手修改排序程序的时候,发现最主要的问题是Cat对象是不能直接用">“、”<"比较的,如果能抽象一个所有对象都能简单实现的比较过程,适合所有数据类型的排序流程就比较容易了,于是老张做了以下的设计:
为此,老张写下了以下的测试代码:
public static void main(String[] args) {
Integer [] data= {11,3,25,8,9,36,13,29,10,50};
CleverSorter cs=new CleverSorter(new IntegerComparer());
cs.sort(data);
for(Integer i:data)System.out.println(i);
Cat[] cats=new Cat[10];
cats[0]=new Cat(11,50);
cats[1]=new Cat(3,10);
cats[2]=new Cat(25,29);
cats[3]=new Cat(8,13);
cats[4]=new Cat(9,36);
cats[5]=new Cat(36,9);
cats[6]=new Cat(13,8);
cats[7]=new Cat(29,25);
cats[8]=new Cat(10,3);
cats[9]=new Cat(50,11);
cs=new CleverSorter(new CatHeightComparer());
cs.sort(cats);
for(Cat c:cats)System.out.println(c);
}
经过一番调试,老张得到了满意的输出:
50
36
29
25
13
11
10
9
8
3
[11,50]
[9,36]
[25,29]
[29,25]
[8,13]
[50,11]
[3,10]
[36,9]
[13,8]
[10,3]
你能写出老张设计的CleverSorter、Comparer、IntegerComparer、CatHeightComparer、Cat几个类的内容吗?