策略模式与简单工厂的实现

策略模式与简单工厂的实现

简单工厂模式我需要让客户端认识两个类,CashSuper和CashFactory,而策略模式与简单工厂结合的用法,客户端就只需要认识一个类CashContext就可以了。耦合更加降低。

代码实现

定义一个Strategy算法接口:

/**
 * @ author 黄栋
 * @ create 2021/10/20
 */
public interface Strategy {
    public double algorithm(double money);
}

创建实现Strategy接口的实现类:

/**
 * 普通算法
 * @ author 黄栋
 * @ create 2021/10/20
 */
public class ConcreteStrategyA implements Strategy {
    @Override
    public double algorithm(double money) {
        //返回原价
        return money;
    }
}
/**
 * 满多少减多少算法
 * @ author 黄栋
 * @ create 2021/10/20
 */
@SuppressWarnings("all")
public class ConcreteStrategyB implements Strategy {
    private double moneyOne;//满多少
    private double moneyTwo;//减多少
    public ConcreteStrategyB(double moneyOne,double moneyTwo){
        this.moneyOne=moneyOne;
        this.moneyTwo=moneyTwo;
    }
    @Override
    public double algorithm(double money) {
        if(money>=moneyOne){
            money=money-moneyTwo;
        }
        return money;
    }
}
/**
 * 折扣算法
 * @ author 黄栋
 * @ create 2021/10/20
 */
@SuppressWarnings("all")
public class ConcreteStrategyC implements Strategy {
    //折扣
    private double moneyRebate;
    public ConcreteStrategyC(double moneyRebate){
        this.moneyRebate=moneyRebate;
    }
    @Override
    public double algorithm(double money) {
        return money*moneyRebate;
    }
}

创建Context 类://其实就是改造了Context类将测试类的判断移到了Context类中

/**
 * @ author 黄栋
 * @ create 2021/10/20
 */
public class Context {

    //算法接口
    private Strategy strategy;

    //初始化时,传入具体的策略对象
    public Context(String type){
        switch (type){
            case "正常收费":
                strategy=new ConcreteStrategyA();
                break;
            case "满500返100":
                strategy=new ConcreteStrategyB(500,100);
                break;
            case "打6折":
                strategy=new ConcreteStrategyC(0.6);
                break;
        }
    }

    //根据具体的策略对象,调用其算法的方法
    public double algorithm(double money){
        return strategy.algorithm(money);
    }
}

创建测试类:

/**
 * @ author 黄栋
 * @ create 2021/10/20
 */
@SuppressWarnings("all")//镇压警告
public class Test {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.print("请输入算法模式:");
        String type = in.next();
        CashContext context =new CashContext(type);
        double algorithm = context.algorithm(999*2);//2为数量,999为单价
        System.out.println("结果:"+algorithm);
    }
}

运行结果:

请输入算法模式:打6折
结果:1198.8
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值