本章要点如下:
题目:用任意一种面向对象语言实现一个计算器控制台程序。要求输入两个数和运算符号,
得到结果。
程序应该做到:(1)可维护;(2)可复用;(3)可扩展;(4)灵活性好。
可维护:就是说代码一处更改,不能产生连锁反应,不能影响其他地方。
可复用:尽量减少重复性代码。
可扩展:如果要扩展新的功能、新的业务,则只需要增加新的类就好了,不对已有的类和逻辑产生影响。插拔式的应用。
面向对象要点:
面向对象三大特性:封装、继承、多态。
通过封装、继承、多态把程序耦合降低。
业务逻辑和界面逻辑分开。
简单工厂模式实现过程如下:
1. 首先,搞清楚业务中容易发生变化的部分。在本应用中,要求计算两个数的运算结果,那么要进行什么样的运算,这就是一个容易发生变化的部分。例如,我们现在只想实现加减乘除运算,后期又想增加开根或者求余运算。那么如何应对这种需求带来的变化。在程序设计的时候就应该考虑到程序的可维护性、可扩展性、代码的可复用性、灵活性等等。
2. 例如现在这个运算器只有加减乘除四种运算。首先建一个Operation类,这个类是各种具体运算类(加减乘除)的父类,主要是接受用户输入的数值。该类如下:
public class Operation {
private double a = 0;
private double b = 0;
public double getA(){
return this.a;
}
public double getB(){
return this.b;
}
public void setA(double a){
this.a = a;
}
public void setB(double b){
this.b = b;
}
public double getResult(){
double result = 0;
return result;
}
}
3. 然后是具体的运算类:Add、Sub、Mul、Div。他们都继承了Operation类,并且重写了getResult()方法。这样就可以用多态性降低不同业务逻辑的耦合度,修改任何一种运算类都不会影响其他的运算类。具体类的代码如下:
public class Add extends Operation{
@Override
public double getResult(){
double result = 0;
result = super.getA() + super.getB();
return result;
}
}
public class Sub extends Operation{
@Override
public double getResult(){
double result = 0;
result = super.getA() - super.getB();
return result;
}
}
public class Mul extends Operation{
@Override
public double getResult(){
double result = 0;
result = super.getA() * super.getB();
return result;
}
}
public class Div extends Operation{
@Override
public double getResult(){
double result = 0;
if(super.getB() == 0)
try {
throw new Exception("除数不能为0!");
} catch (Exception e) {
e.printStackTrace();
}
result = super.getA() / super.getB();
return result;
}
}
4. 那么如何让计算器知道我是要用哪一种运算呢?也就是说到底要实例化哪一个具体的运算类,Add?Sub?Mul?Div?这时就应该考虑用 一个单独的类来做这个创造具体实例的过程,这个类就是工厂类。如下:
public class OperationFactory {
public Operation createOperation(String operate){
Operation oper = null;
operate = operate.trim();
if("".equals(operate) || operate == null)
try {
throw new Exception("您还没有输入操作符!");
} catch (Exception e) {
e.printStackTrace();
}
if(operate.equals("+"))
oper = new Add();
if(operate.equals("-"))
oper = new Sub();
if(operate.equals("*"))
oper = new Mul();
if(operate.equals("/"))
oper = new Div();
return oper;
}
}
5. 这样,用户只要输入运算符,工厂类就可以创建合适的实例,通过多态性,即返回给父类的方式实现运算结果。客户端代码如下:
public class Client {
public static void main(String[] args){
try{
double a,b;
String operate;
System.out.println("请输入数字A:");
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
a = Double.valueOf(buf.readLine()).doubleValue();
System.out.println("请输入运算符号(+-*/):");
operate = buf.readLine().trim();
System.out.println("请输入数字B:");
b = Double.valueOf(buf.readLine()).doubleValue();
Operation o = new OperationFactory().createOperation(operate);
o.setA(a);
o.setB(b);
System.out.println(o.getResult());
}catch(Exception e){
e.printStackTrace();
}
}
}
该应用的UML图(from:《大话设计模式》)如下:
- 大小: 36.3 KB
分享到:
相关推荐
大话设计模式源代码之简单工厂模式 经典代码
大话设计模式 完整设计模式介绍
抽象工厂模式 原型模式 建造者模式 单例模式 结构型模式 队列模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为模式(类行为模式) 解释器模式 模板方法模式 行为模式(对象行为模式) 策略模式 ...
《大话设计模式》C++实现-design-patterns-cpp
- **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在.NET中,可以用于跨平台或不同环境下的对象创建。 - **单例模式**:确保一个类只有一个实例,并提供一个全局访问点...
大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf
设计模式之《大话设计模式》.pptx
单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...
Android之大话设计模式——:抽象工厂模式借鉴.pdf
树懒自己整理的大话设计模式的修行笔记,对程序设计有很大的帮助,主要是以自己学习的习惯整理的!
android之大话设计模式.pdf
《大话设计模式》对各种设计模式,做简要归纳(原创)
本文将详细探讨如何在C#中应用简单工厂模式来设计一个计算器,实现基本的邻位四则运算。 简单工厂模式是创建型设计模式之一,它的主要作用是提供一个工厂类,负责根据输入条件(例如运算符)动态地创建对象。在本例...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式主要用于封装一系列算法,并让它们之间可以互相替换,使得算法的变化独立于使用算法的客户。这种模式通常涉及三个主要角色:策略...
大话设计模式之外观模式 经典代码 C#类
android之大话设计模式整理.pdf
读书笔记:大话设计模式C++
Android之大话设计模式——:抽象工厂模式参考.pdf
工厂模式(Factory Pattern)是创建型设计模式,它提供了一种创建对象的机制,允许客户端在不知道具体实现细节的情况下创建对象。工厂模式有两个主要角色:工厂类和产品类。工厂类负责创建对象,而产品类是被创建的...