阿里面试题:设计相关的系统对外提供商品实时价格获取功能
Posted Dream_it_possible!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里面试题:设计相关的系统对外提供商品实时价格获取功能相关的知识,希望对你有一定的参考价值。
题目
要求:
(1)尽可能展示你的编码能力(Java语法、编码风格等),java语言肯定比伪代码得分高
(2)有疑问请随时问我们现场的工作人员
(3) 时间30分钟问题1:某电商公司是多站点结构,目前已经开设了ABC三个子站点,
这3个子站点的会员等级体系不同,但产品模型和数据是完全一致的,
产品平时在各个站点分别有不同的销售价格;
现计划在全公司范围内进行618大促,活动期间为6月17日零时-6月19日零时,针对不同用户的会员等级,对产品销售实行不同折扣优惠;
请设计相关的系统对外提供商品实时价格获取功能;
A公司
超级VIP用户:7折优惠
VIP用户:9折优惠
普通用户:无优惠
B公司
金牌客户:6.5折优惠
银牌客户:7.5折优惠
铜牌客户:8.5折优惠
普通用户:无优惠
C公司
皇冠会员:8折优惠
普通用户:无优惠
方案一
我发现每个公司对外提供的价格的方式是差不多相同的,只是价格和折扣不同,我们可以通过接口的形式实现, parentCompany接口提供三个方法 getPrice()、getReducePrice和getRate()分别表示获取价格、折扣后的价格、商品的折扣率,然后由子公司去实现,然后在子公司的构造方法里去初始化会员等级以及对应的折扣率。
package ali.program;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/5 17:53
*/
public class CompanyA implements ParentCompany {
private Map<String, BigDecimal> disCountMap = new HashMap<>();
public CompanyA() {
init();
}
private void init() {
disCountMap.put("SVIP", new BigDecimal("0.7"));
disCountMap.put("VIP", new BigDecimal("0.9"));
disCountMap.put("GENERAL", new BigDecimal("1"));
}
@Override
public BigDecimal getPrice(Integer id) {
Product product = ProductFactory.getProduct(id);
return product.getPrice();
}
@Override
public BigDecimal getReducePrice(Integer id, BigDecimal rate) {
return rate.multiply(getPrice(id));
}
@Override
public BigDecimal getRate(String identity) {
BigDecimal rate = disCountMap.get(identity);
return rate == null ? new BigDecimal("1.0") : rate;
}
}
产品工厂:
package ali.program;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/5 18:05
* 生产商品
*/
public class ProductFactory {
private static Map<Integer, Product> products = new HashMap<>();
static {
products.put(1, new Product(1, "小米手机", new BigDecimal("2000")));
products.put(2, new Product(2, "华为手机", new BigDecimal("2000")));
products.put(3, new Product(3, "苹果手机", new BigDecimal("2000")));
}
public static Product getProduct(Integer id) {
Product product = products.get(id);
if (null == product) {
product = new Product(id, "小米手机", new BigDecimal("1000"));
products.put(id, product);
}
return product;
}
}
主测试类:
package ali.program;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/5 17:50
*
* 要求:
* (1)尽可能展示你的编码能力(Java语法、编码风格等),java语言肯定比伪代码得分高
* (2)有疑问请随时问我们现场的工作人员
* (3) 时间30分钟
* <p>
* 问题1:某电商公司是多站点结构,目前已经开设了ABC三个子站点,
* 这3个子站点的会员等级体系不同,但产品模型和数据是完全一致的,
* 产品平时在各个站点分别有不同的销售价格;
* 现计划在全公司范围内进行618大促,活动期间为6月17日零时-6月19日零时,针对不同用户的会员等级,对产品销售实行不同折扣优惠;
* 请设计相关的系统对外提供商品实时价格获取功能;
* A公司
* 超级VIP用户:7折优惠
* VIP用户:9折优惠
* 普通用户:无优惠
* B公司
* 金牌客户:6.5折优惠
* 银牌客户:7.5折优惠
* 铜牌客户:8.5折优惠
* 普通用户:无优惠
* C公司
* 皇冠会员:8折优惠
* 普通用户:无优惠
*/
public class ProductPrice {
public static void main(String[] args) {
CompanyA companyA = new CompanyA();
System.out.println(String.format("A公司的商品的原价为:%s", companyA.getPrice(1)));
BigDecimal rate = companyA.getRate("SVIP");
System.out.println(String.format("A公司SVIP折扣后的价格为:%s", companyA.getReducePrice(1, rate)));
}
}
方案二
方案二是对方案一的优化,因为获取价格、获取折扣和获取折扣后的价格都是公共的方法,因此可以把这三个方法放到一个抽象类里。
package ali.program;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/5 17:52
*/
public abstract class ParentCompany {
private Map<String, BigDecimal> disCountMap = new HashMap<>();
public ParentCompany() {
disCountMap.put("GENERAL", new BigDecimal("1.0"));
setDisCountMap(disCountMap);
}
protected abstract void setDisCountMap(Map<String, BigDecimal> map);
public BigDecimal getPrice(Integer id) {
Product product = ProductFactory.getProduct(id);
return product.getPrice();
}
public BigDecimal getReducePrice(Integer id, BigDecimal rate) {
return rate.multiply(getPrice(id));
}
public BigDecimal getRate(String identity) {
BigDecimal rate = disCountMap.get(identity);
return rate == null ? new BigDecimal("1.0") : rate;
}
}
由子类去负责维护即子公司去负责维护会员和对应的折扣:
package ali.program;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/5 17:53
*/
public class CompanyA extends ParentCompany {
@Override
protected void setDisCountMap(Map<String, BigDecimal> disCountMap) {
disCountMap.put("SVIP", new BigDecimal("0.7"));
disCountMap.put("VIP", new BigDecimal("0.9"));
}
}
测试类:
package ali.program;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
/**
* @decription:
* @author: zhengbing.zhang
* @date: 2021/7/5 17:50
* <p>
* 要求:
* (1)尽可能展示你的编码能力(Java语法、编码风格等),java语言肯定比伪代码得分高
* (2)有疑问请随时问我们现场的工作人员
* (3) 时间30分钟
* <p>
* 问题1:某电商公司是多站点结构,目前已经开设了ABC三个子站点,
* 这3个子站点的会员等级体系不同,但产品模型和数据是完全一致的,
* 产品平时在各个站点分别有不同的销售价格;
* 现计划在全公司范围内进行618大促,活动期间为6月17日零时-6月19日零时,针对不同用户的会员等级,对产品销售实行不同折扣优惠;
* 请设计相关的系统对外提供商品实时价格获取功能;
* A公司
* 超级VIP用户:7折优惠
* VIP用户:9折优惠
* 普通用户:无优惠
* B公司
* 金牌客户:6.5折优惠
* 银牌客户:7.5折优惠
* 铜牌客户:8.5折优惠
* 普通用户:无优惠
* C公司
* 皇冠会员:8折优惠
* 普通用户:无优惠
*/
public class ProductPrice {
public static void main(String[] args) {
CompanyA companyA = new CompanyA();
System.out.println(String.format("A公司的商品的原价为:%s", companyA.getPrice(1)));
BigDecimal rate = companyA.getRate("SVIP");
System.out.println(String.format("A公司SVIP折扣后的价格为:%s", companyA.getReducePrice(1, rate)));
CompanyB companyB = new CompanyB();
System.out.println(String.format("B公司的商品的原价为:%s", companyB.getPrice(1)));
BigDecimal rate1 = companyB.getRate("GOLD");
System.out.println(String.format("B公司金牌用户折扣后的价格为:%s", companyB.getReducePrice(1, rate1)));
CompanyC companyC = new CompanyC();
System.out.println(String.format("C公司的商品的原价为:%s", companyC.getPrice(1)));
BigDecimal rate2 = companyC.getRate("CROWN");
System.out.println(String.format("C公司皇冠用户折扣后的价格为:%s", companyC.getReducePrice(1, rate2)));
}
}
打印结果为:
此题是我面试蚂蚁金服出的一道编程题,电话面试的时候大概晚上11点的样子,当时的思绪可能没有那么清晰,现在捋一下,感觉是在考验我们的代码设计能力,两个方法都能实现,但是方案二的代码量明显要少于方案一。
以上是关于阿里面试题:设计相关的系统对外提供商品实时价格获取功能的主要内容,如果未能解决你的问题,请参考以下文章