网站首页 > java教程 正文
提出问题:设计一个简单的计算器功能。
private final static String ADD = "+"; public static void main(String[] args) { System.out.println("请输入数字A"); Scanner scannerA = new Scanner(System.in); double numberA = scannerA.nextDouble(); System.out.println("请输入数字B"); Scanner scannerB = new Scanner(System.in); double numberB = scannerB.nextDouble(); System.out.println("请输入运算符C"); Scanner scannerC = new Scanner(System.in); String operator = scannerC.next(); if (ADD.equalsIgnoreCase(operator)) { System.out.println(numberA + numberB); }
这样就实现了一个加法计算器,那么问题来了,如果我要为计算器新增减法功能呢?有些同学就说新增一个if判断不就好了?那么问题又来了,我有N个类都用了计算器我们是不是就要去N个地方去修改?是的,那么我们很容易就可以想到利用封装的思想将计算逻辑与控制台输入给分开,改造好的运算逻辑方法,如下:
/** * 这里用到了封装思想,封装了运算方法,将输入和运算逻辑分开了 * @param numberA 输入的第一个值 * @param numberB 输入的第二个值 * @param operator 运算符 * @author WangHan * @date 2019/1/21 16:15 */ private static double operation(double numberA, double numberB, String operator) { if (ADD.equalsIgnoreCase(operator)) { return numberA + numberB; } else if (SUBTRACT.equalsIgnoreCase(operator)) { return numberA - numberB; }else { return 0; } }
这样尽管我有N多个地方输入计算值和计算符号,我也可以都调用这一个operation方法来计算结果!这就是封装的思想了。
继续改造,如果此时要增加两个运算符*和/,需要修改operation方法让加减法也参与了重新编译,如果不小心将加减法改错那么就是坑爹!
增加需求,尽可能的扩展的来解决问题而不是去修改原来的代码
此时我们新增一个算法的父类Operation,并且新增两个子类OperationAdd 和OperationSub 去继承Operation分别实现加减算法。:
/** * 第二版,重写operation方法 * @author WangHan * @date 2019/1/21 16:33 */ @Data public class Operation { public double numberA = 0; public double numberB = 0; public double getResult() { return 0; } public static class OperationAdd extends Operation { /** * 重写getResult方法 */ @Override public double getResult() { return numberA + numberB; } } public static class OperationSub extends Operation { /** * 重写getResult方法 */ @Override public double getResult() { return numberA - numberB; } } }
新增一个工厂类OperationFactory:
** * 运算逻辑简单工厂 * 第三版就实现了简单工厂模式 * 如果我要更改加法运算规则我只需要修改OperationAdd子类就可以, * 如果我要增加乘除等其他运算,就加一个子类OperationMul等,再OperationFactory增加一个switch的分支就可以解决 * @author WangHan * @date 2019/1/21 17:01 */ class OperationFactory { static Operation createOperation(double numberA, double numberB, String operator) { Operation operation; switch (operator) { case "+": operation = new Operation.OperationAdd(); operation.setNumberA(numberA); operation.setNumberB(numberB); return operation; case "-": operation = new Operation.OperationSub(); operation.setNumberA(numberA); operation.setNumberB(numberB); return operation; default: return null; } } }
通过判断运算符去确定我要实例化那个算法的子类就可以了
这样在实现计算器功能的时候就用到了简单工厂模式,我们调用工厂类去实例化算法:
Optional<Operation> optional = Optional.ofNullable(OperationFactory.createOperation(numberA, numberB, operator));
optional.ifPresent(operation ->System.out.println("第三版计算结果:" + operation.getResult()));
学习到这里简单做个笔记!
猜你喜欢
- 2024-10-23 Java开发篇——设计模式(3)面试被问工厂模式?不要怕看这里
- 2024-10-23 架构师成长之路:Java设计模式之工厂模式
- 2024-10-23 Java的设计模式(十一):三种工厂模式区别,SpringBoot中的运用
- 2024-10-23 Java——工厂方法模式(java的工厂模式是什么意思啊)
- 2024-10-23 Java编程细节——设计模式之工厂模式
- 2024-10-23 Java之工厂方法(Factory Method)(java工厂模式的应用场景)
- 2024-10-23 Java工厂设计模式学习笔记(详细总结)
- 2024-10-23 教你轻松学Java开发23种设计模式 --工厂设计模式
- 2024-10-23 java设计模式-创建者模式-工厂模式
- 2024-10-23 设计模式——工厂方法模式(工厂设计模式的优点)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)