第八次实验

文章描述了一个商场销售系统的商品打折算法设计,包括普通消费者和不同VIP等级的打折规则,并提出了应对将来打折策略扩展的需求。同时,文章讨论了如何从整型数据选择排序演进到设计一个通用的排序器,以便适应不同类型数据的排序,包括自定义对象如Cat类的比较排序。
摘要由CSDN通过智能技术生成

第八次实验

打折的商品

老张的团队正在开发一个商场销售系统,需求中存在这样一段描述:
商品打折需求:
商场商品的打折存在两种场景,一个是消费到一定级别将得到白铁、青铜、白银和黄金四个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几个类的内容吗?

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值