前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码实现:会员制度,分普通会员和超级会员

代码实现:会员制度,分普通会员和超级会员

原创
作者头像
艳艳代码杂货店
修改2021-09-26 09:38:04
1.7K0
修改2021-09-26 09:38:04
举报
文章被收录于专栏:艳艳代码杂货店
代码语言:javascript
复制
public Double computePrice(String type, Double price) {
    if ("VIP".equals(type)) {
        // 普通会员9折优惠
        return price * 0.9;
    } else if ("S_VIP".equals(type)) {
        // 超级会员8折优惠
        return price * 0.8;
    } else {
        // 非会员无优惠
        return price;
    }
}

几天后。。。

产品经理:我们增加了活动送的一个月体验会员,与普通会员享受同等九折待遇,但是只能享受最高20的优惠金额。

靓仔:明白,不就是“穷逼vip”吗

于是就在原来的代码上改了改

代码语言:javascript
复制
public Double computePrice(String type, Double price) {
    if ("VIP".equals(type)) {
        // 普通会员9折优惠
        return price * 0.9;
    } else if ("S_VIP".equals(type)) {
        // 超级会员8折优惠
        return price * 0.8;
    } else if ("BEGGAR_VIP".equals(type)) {
        // 穷逼vip 9折优惠,最大优惠金额20
        return price > 200 ? (price - 20) : price * 0.9;
    }else {
        // 非会员无优惠
        return price;
    }
}

有没有觉得 if-else 特别多,而且一旦再增加会员种类,那么看上去就更繁琐,代码耦合严重,维护起来十分不方便。

怎么办,重构一下代码呗

首先提取出价格计算的接口类

代码语言:javascript
复制
public interface PriceStrategy {
    Double computePrice(Double price);
}

然后针对不同的会员类型,实现不同会员价格计算接口,提供算法

代码语言:javascript
复制
// 普通会员
public class VipPriceStrategy implements PriceStrategy{
    @Override
    public Double computePrice(Double price) {
        return price * 0.9;
    }
}

// 超级会员
public class SVipPriceStrategy implements PriceStrategy{
    @Override
    public Double computePrice(Double price) {
        return price * 0.8;
    }
}

// 穷逼会员
public class BeggarVipPriceStrategy implements PriceStrategy{
    @Override
    public Double computePrice(Double price) {
        return price > 200 ? (price - 20) : price * 0.9;
    }
}

增加一个上下文角色,封装算法对高层屏蔽,高层模块只用访问Context

代码语言:javascript
复制
public class PriceContext {
    private PriceStrategy priceStrategy;   
    
    public PriceContext(PriceStrategy priceStrategy) {
        this.priceStrategy = priceStrategy;
    }

    public Double computePrice(Double price) {
        return priceStrategy.computePrice(price);
    }
}

外部调用,计算价格

代码语言:javascript
复制
public Double getPrice(String type, Double price) {
    PriceStrategy priceStrategy;
    if ("VIP".equals(type)) {
        priceStrategy = new VipPriceStrategy();
    } else if ("S_VIP".equals(type)) {
        priceStrategy = new SVipPriceStrategy;
    } else if ("BEGGAR_VIP".equals(type)) {
        priceStrategy = new BeggarVipPriceStrategy;
    } else {
        return price;
    }
    PriceContext priceContext = new PriceContext(priceStrategy);
    return priceContext.computePrice(price);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档