阿里面试题:设计相关的系统对外提供商品实时价格获取功能

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点的样子,当时的思绪可能没有那么清晰,现在捋一下,感觉是在考验我们的代码设计能力,两个方法都能实现,但是方案二的代码量明显要少于方案一。

以上是关于阿里面试题:设计相关的系统对外提供商品实时价格获取功能的主要内容,如果未能解决你的问题,请参考以下文章

java面试题 单例设计模式

Spark面试题——Spark容错机制

Java每日面试题大厂是如何设计秒杀系统的?

阿里面试必问的Dubbo相关问题

c#面试题记录

2021年阿里Java面试题精选,Java架构师成长路线