设计模式笔试题

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());
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值