Java策略模式

Java策略模式

参考书目 《大话设计模式》 程杰 清华大学出版社

代码链接 https://github.com/JiaZhengJingXianSheng/Calculate_By_Java_Version2

本文是对上篇 Java简单工厂模式 的重写,以达到代码更易于维护的目的。

一、 定义接口

与上篇不同,这篇我们选择定义接口,并在后续功能实现中, i m p l e m e n t implement implement 我们的接口。

接口定义加上参数,方便后期调用,定义如下

public interface OperationInterface {
    double getResult(double A, double B) throws Exception;
}

二、 定义运算

接下来定义各种方法,来实现我们的接口。

public class OperationAdd implements OperationInterface {
    @Override
    public double getResult(double A, double B) {
        return A + B;
    }
}
public class OperationSub implements OperationInterface {
    @Override
    public double getResult(double A, double B) {
        return A - B;
    }
}
public class OperationMul implements OperationInterface {
    @Override
    public double getResult(double A, double B) {
        return A * B;
    }
}

public class OperationDiv implements OperationInterface {
    @Override
    public double getResult(double A, double B) throws Exception {
        if (B == 0) {
            throw new Exception("除数不能为0 ");
        }
        return A / B;
    }
}

同样,还是去判断除数是否为0,为零抛出异常。

三、 策略定义

接下来我们在策略结构体中,定义我们的操作接口,并书写构造函数。

再根据我们的具体策略,返回其对应计算函数。

public class Operation {
    OperationInterface strategy;
    public Operation(OperationInterface strategy){
        this.strategy = strategy;
    }
    // 根据具体策略对象,调用其方法。
    public double ContextInterface(double A, double B) throws Exception {
        return strategy.getResult(A,B);
    }

}

四、 测试

在主函数中定义策略,并传入数值 A , B A,B A,B 与操作符 o p e r a t e operate operate

根据操作符,生成对应运算,并构造策略。

最终调用具体策略对应的计算函数。

public class Calculator {
    public static void main(String[] args) throws Exception {
        Operation operation = null;
        Scanner in = new Scanner(System.in);
        double A = in.nextDouble();
        String operate = in.next();
        double B = in.nextDouble();

        switch (operate) {
            case "+":
                operation = new Operation(new OperationAdd());
                break;
            case "-":
                operation = new Operation(new OperationSub());
                break;
            case "*":
                operation = new Operation(new OperationMul());
                break;
            case "/":
                operation = new Operation(new OperationDiv());
                break;
        }

        System.out.println(A + " + " + B + " = " + operation.ContextInterface(A, B));
    }
}
// 运行结果
1 + 2
1.0 + 2.0=3.0

总结

策略模式和工厂模式是比较类似的,工厂模式是通过继承抽象计算函数,并实现,本质来说和接口基本一样。 策略模式是用来封装算法的,但在实际中,我们发现可以用它来封装几乎任何类型的规则。

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的 C o n t e x t Context Context 对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值