精通Java设计模式从初见到相爱之工厂+策略模式(3)

本文介绍了策略模式和简单工厂模式的应用,通过实例演示如何根据不同会员级别应用不同的折扣策略,并结合简单工厂模式进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、公司项目需求。

    用户签到活动,会员签到怎么处理,超级会员怎么处理,普通用户签到怎么处理,针对不同的档次,有不同的方案,所以在项目中用到了策略模式以及简单工厂模式。

    其实生活中,我们用到的软件系统都会有这样的制定级别,比如我们是实体店,他也有一个会员制度,打9折,打七折,打六折的都有,包括我们做头发,也都有不同级别的剪发卡.... 这些理发店啊、服装店啊还有什么美容spa店等等用的软件都会涉及,这就是我们所说的策略模式。

2、策略模式的概念

    概念:针对一类问题,用不同的方式的解决,这就是策略模式!

    举例1:明星演唱会,我们去买门票,路人甲买的一等座,路人乙买的二等座,路人丙买的外围座,虽然他们都能看到明星演唱,但是位置不同,针对买座位的不同级别来设置他们的观看明星位置,就是策略模式!

    举例2:去李宁专卖店买衣服,路人甲和路人乙买同一件衣服,虽然都能买到衣服,但是路人甲是会员,路人乙是普通用户,他们支付的钱不一样,路人甲花钱少,针对买衣服不同人的级别折扣不一样,就是策略模式!

3、代码实现

    项目中用到的比较多,例如商城会员、签到级别、游戏上、这种项目用的策略设计模式比较多

    说个场景,服装店,买衣服,会员级别分别是:AVip、BVip、CVip 和没有会员的用户NoVip,四个级别,打折情况分别是0.6、0.7、0.9和没有打折

    打折的接口

public interface DisCount {
    //买东西给折扣
    Double disCount(Double money);
}

不同会员级别的实现类,不同的折扣

package ceLve;

public class AVip implements DisCount {

    @Override
    public Double disCount(Double money) {
        return money * 0.6 ;
    }
}
package ceLve;

public class BVip implements DisCount {
    @Override
    public Double disCount(Double money) {
        return money * 0.7;
    }
}
package ceLve;

public class CVip implements DisCount {
    @Override
    public Double disCount(Double money) {
        return money * 0.9;
    }
}
package ceLve;

public class NoVip implements DisCount {

    //普通用户不能打折
    @Override
    public Double disCount(Double money) {
        return money;
    }
}
package ceLve;

public class Customer  {

    //客户消费总金额
    private Double totalAccount =0D;

    //客户目前消费金额
    private Double currentAccount = 0D;

    //默认消费者 没有会员等级
    private DisCount disCount = new NoVip();

    //消费者 消费商品、衣服的方法
    public void buy(Double money){

        this.currentAccount = money;
        totalAccount       += money;

        if (totalAccount >= 10000){
            disCount= new AVip();
        }else if (totalAccount >= 6000){
            disCount= new BVip();
        }else if (totalAccount >= 3000){
            disCount= new CVip();
        }else {
            disCount= new NoVip();
        }
        
    }
    // 消费者支付
    public double pay(){
        return disCount.disCount(currentAccount);
    }

    public Double getTotalAccount() {
        return totalAccount;
    }

    public void setTotalAccount(Double totalAccount) {
        this.totalAccount = totalAccount;
    }

    public Double getCurrentAccount() {
        return currentAccount;
    }

    public void setCurrentAccount(Double currentAccount) {
        this.currentAccount = currentAccount;
    }

}

最后在main函数中执行:

package ceLve;

public class Main {

    public static void main(String[] args){
        Customer customer = new Customer();
        customer.buy(5000.00);
        System.out.println(customer.pay());
    }
}

运行结果:4500.00

    上面是纯粹的是策略模式,现在我要加上简单工厂模式,其实加上与不加上没有什么区别,就自我感觉就是吃饭为什么非要用右手使用筷子,而不是左手,小时候家长我只要用左手就打我手。因为我们中国的传统就是右手,所以因为传统的原因,目前简单工厂设计模式也如此,也基本没什么用,但有人会说硬编码,不能随随便便new,那好吧,今天把简单工厂模式也加进去。

    修改方案:修改Customer类,新增简单工厂类CountFactory

package ceLve;

public class Customer  {

    //客户消费总金额
    private Double totalAccount =0D;

    //客户目前消费金额
    private Double currentAccount = 0D;

    //默认消费者 没有会员等级
    private DisCount disCount = new NoVip();

    //消费者 消费商品、衣服的方法
    public void buy(Double money){

        this.currentAccount = money;
        totalAccount       += money;

        disCount = CountFactory.createCount(this);
    }
    // 消费者支付
    public double pay(){
        return disCount.disCount(currentAccount);
    }

    public Double getTotalAccount() {
        return totalAccount;
    }

    public void setTotalAccount(Double totalAccount) {
        this.totalAccount = totalAccount;
    }

    public Double getCurrentAccount() {
        return currentAccount;
    }

    public void setCurrentAccount(Double currentAccount) {
        this.currentAccount = currentAccount;
    }

}
public class CountFactory {

    private CountFactory(){}

    public static DisCount createCount(Customer customer){

        if (customer.getTotalAccount() >= 10000){
            return new AVip();
        }else if (customer.getTotalAccount() >= 6000){
            return new BVip();
        }else if (customer.getTotalAccount() >= 3000){
            return new CVip();
        }else {
            return new NoVip();
        }
    }
}

main函数代码不变

结果依然4500.00

其实大家看下来就感觉没那么多必要的,我直接if else也可以解决的,没有这么麻烦呀,不对的,简单的小项目可以这样,但是如果活动量增加的话,没必要在controller或者service层去判断它应用那种策略,他其实说白了就是一个处理方式的一个工具类!我们把它封装好,什么时候用,什么时候调用就好,就像jdk中的时间,其实我们项目中也会有很多工具类,他其实有点类似那样!

    

 

转载于:https://my.oschina.net/mdxlcj/blog/1787501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值