1、题目1
一家音像制品店销售了各式各样的音像制品,包含如CD唱片、VCD影片、DVD影片和蓝光影片等。 由于目前处理销售淡季,音像制品店老板希望做一些促销活动,针对一些特定的产品推出一些优惠活动,活动内容如下: 1)任意客户一次性购买VCD碟片满200元,送一张蓝光影片一张; 2)任意客户一次性购买DVD D9碟片满8张,就打9折; 要求: 1)针对上述需求写一个简单的分析(字数不限) 2)设计相应的数据结构 3)请用自己最熟悉的语言写一个收银机程序,该程序能够自动计算出总价,并打印明细。
package test.shoppingcart.model;
import java.io.Serializable;
/**
* 商品
*
* @author Administrator
*
*/
public abstract class Commodity implements Serializable {
private static final long serialVersionUID = 7111046014915319904L;
protected String name;
protected double price;
protected String sn;
protected String validate;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getValidate() {
return validate;
}
public void setValidate(String validate) {
this.validate = validate;
}
@Override
public String toString() {
return "Commodity [name=" + name + ", price=" + price + ", sn=" + sn + ", validate=" + validate + "]";
}
}
package test.shoppingcart.model;
public class DVD extends Commodity {
private static final long serialVersionUID = -5938569445753451675L;
}
package test.shoppingcart.model;
public class DVD9 extends DVD {
private static final long serialVersionUID = 2680014167158542125L;
public DVD9() {
super.name = "DVD9";
super.price = 60.0d;
super.sn = "123456";
super.validate = "20991231";
}
}
package test.shoppingcart.model;
public class DVDBlue extends Commodity {
private static final long serialVersionUID = 3559142666893595895L;
public DVDBlue() {
super.name = "DVDBlue";
super.price = 50.0d;
super.sn = "4215";
super.validate = "20991231";
}
}
package test.shoppingcart.model;
/**
* 购物条目录
*
* @author Administrator
*
*/
public class Entry {
Commodity commodity;
/** 数量 */
int copies = 0;
/** 原价 */
double originalPirce;
/** 折扣价 */
double currentPrice;
public Entry(Commodity commodity, int copies, double originalPirce, double currentPrice) {
this.commodity = commodity;
this.copies = copies;
if (originalPirce == 0) {
this.originalPirce = commodity.getPrice() * copies;
}
this.currentPrice = currentPrice;
}
public Commodity getCommodity() {
return commodity;
}
public void setCommodity(Commodity commodity) {
this.commodity = commodity;
}
public int getCopies() {
return copies;
}
public void setCopies(int copies) {
this.copies = copies;
}
public double getOriginalPirce() {
return originalPirce;
}
public void setOriginalPirce(double originalPirce) {
this.originalPirce = originalPirce;
}
public double getCurrentPrice() {
return currentPrice;
}
public void setCurrentPrice(double currentPrice) {
this.currentPrice = currentPrice;
}
@Override
public String toString() {
return "Entry [commodity=" + commodity + ", copies=" + copies + ", originalPirce=" + originalPirce + ", currentPrice=" + currentPrice + "]";
}
}
package test.shoppingcart.model;
public class VCD extends Commodity {
private static final long serialVersionUID = 5127362020171422936L;
public VCD() {
super.name = "VCD";
super.price = 10.0d;
super.sn = "123456";
super.validate = "20991231";
}
}
package test.shoppingcart.model;
public class CD extends Commodity {
private static final long serialVersionUID = 3487982392117475933L;
}
策略模式应用:
package test.shoppingcart.strategy;
import java.util.List;
import test.shoppingcart.model.Entry;
/**
* 折扣基类
*
* @author Administrator
*
*/
public abstract class Discount {
/**
* 折扣
* @param entry 购物单的中物品条目
* @param buyEntries 购物单中的物品
*/
public abstract void calcDiscount(Entry entry,List<Entry> buyEntries);
}
package test.shoppingcart.strategy;
import java.util.List;
import test.shoppingcart.model.Commodity;
import test.shoppingcart.model.Entry;
/**
* 商品折扣
*
* @author Administrator
*
*/
public class CommodityDiscount extends Discount {
@Override
public void calcDiscount(Entry entry,List<Entry> buyEntries) {
Commodity c = entry.getCommodity();
entry.setOriginalPirce(new Double(c.getPrice() * entry.getCopies()));
entry.setCurrentPrice(new Double(c.getPrice() * entry.getCopies()));
}
}
package test.shoppingcart.strategy;
import java.util.List;
import test.shoppingcart.model.Commodity;
import test.shoppingcart.model.DVD9;
import test.shoppingcart.model.Entry;
public class DVD9Discount extends CommodityDiscount {
@Override
public void calcDiscount(Entry entry, List<Entry> buyEntries) {
super.calcDiscount(entry, buyEntries);
Commodity c = entry.getCommodity();
if (c instanceof DVD9 && entry.getCopies() >= 8) {
entry.setCurrentPrice(new Double(c.getPrice() * entry.getCopies() * 0.95));
}
}
}
package test.shoppingcart.strategy;
import java.util.List;
import test.shoppingcart.model.DVDBlue;
import test.shoppingcart.model.Entry;
import test.shoppingcart.model.VCD;
public class VCDDiscount extends CommodityDiscount {
@Override
public void calcDiscount(Entry entry, List<Entry> buyEntries) {
// 商品的价格优惠
super.calcDiscount(entry, buyEntries);
// VCD的赠送
if (entry.getCommodity() instanceof VCD && entry.getCopies() * entry.getCommodity().getPrice() >= 200d) {
// 赠送的
Entry present = new Entry(new DVDBlue(), 1, 0d, 0d);
buyEntries.add(present);
}
}
}
责任链模式应用:
package test.shoppingcart;
import java.util.List;
import test.shoppingcart.model.Entry;
import test.shoppingcart.strategy.Discount;
/**
* 责任链
* @author Administrator
*
*/
public class DiscountChain {
private DiscountChain next;
private Discount discount;
public DiscountChain(DiscountChain next, Discount discount) {
this.next = next;
this.discount = discount;
}
public void handle(Entry entry, List<Entry> buyEntries) {
discount.calcDiscount(entry, buyEntries);
if (next != null) {
next.handle(entry, buyEntries);
}
}
}
程序入口:
package test.shoppingcart;
import java.util.ArrayList;
import java.util.List;
import test.shoppingcart.model.DVD9;
import test.shoppingcart.model.Entry;
import test.shoppingcart.model.VCD;
import test.shoppingcart.strategy.DVD9Discount;
import test.shoppingcart.strategy.VCDDiscount;
/***
* 结算
*
* @author Administrator
*
*/
public class Charge {
public static void main(String[] args) {
List<Entry> buyEntries = new ArrayList<Entry>();
List<Entry> presentEntries = new ArrayList<Entry>();
Entry vcdEntry = new Entry(new VCD(), 20, 0, 0);
Entry dvd9Entry = new Entry(new DVD9(), 8, 0, 0);
buyEntries.add(vcdEntry);
buyEntries.add(dvd9Entry);
// 创建责任链条
DiscountChain chain = new DiscountChain(new DiscountChain(null, new DVD9Discount()), new VCDDiscount());
Entry entry = null;
double totalCost = 0d;// 消费总价
for (int i = 0; i < buyEntries.size(); i++) {
entry = buyEntries.get(i);
chain.handle(entry, presentEntries);
totalCost += entry.getCurrentPrice();//累加消费金额
}
buyEntries.addAll(presentEntries);// 添加赠送的商品
System.out.println("总价:" + totalCost);
System.out.println(buyEntries.toString());
}
}