`
suifeng
  • 浏览: 183387 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

用面向概念实现 a [+-*/] b 运算

阅读更多

代码如下:

新建类 test.calcu.Drive.java, copy下面代码到Eclipse中执行(jdk 1.5)

 

 

package test.calcu;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

//面向概念编程demo--a op b

/*=========================*\
  step 1 : 提出概念  a 运算  b
\*=========================*/

interface A_Op_B_Concept {
	/**
	 * a运算b
	 * @return a运算b的值
	 * @throws Exception 
	 */
	void a_op_b() throws Exception;
	
	/**
	 * 处理异常
	 * @param e 
	 */
	void dealException(Exception e);
}

/*==============================*\
	step 2 构造实体 ---具体化概念
	
	一般包含两个实体:视图和模型
	2.1, 模型实体
	2.2, 视图实体
	
\*==============================*/


/**
 *模型实体
 */
abstract class A_Op_B_Model implements A_Op_B_Concept {

	String operatorSymbol;
	
	public String getOperatorSymbol() {
		return operatorSymbol;
	}

	public void setOperatorSymbol(String operatorSymbol) {
		this.operatorSymbol = operatorSymbol;
	}

	int a;
	int b;
	int result;
	
	String exceptionMessage;

	public void setExceptionMessage(String exceptionMessage) {
		this.exceptionMessage = exceptionMessage;
	}

	public String getExceptionMessage() {
		return this.exceptionMessage;
	}

	public int getResult() {
		return result;
	}

	public void setResult(int result) {
		this.result = result;
	}
	
	public int getA() {
		return a;
	}

	public int getB() {
		return b;
	}

	public void setA(int a) {
		this.a = a;
	}

	public void setB(int b) {
		this.b = b;
	}

	public abstract void a_op_b() throws Exception;
}

//加模型
class A_Add_B_Model extends A_Op_B_Model {

	A_Add_B_Model() {
		this.operatorSymbol = "+";
	}

	public void a_op_b() {
		result = a + b;
	}

	public void dealException(Exception e) {
		this.exceptionMessage = "不可能发生";
	}
}	
//减模型
class A_Subtract_B_Model extends A_Op_B_Model {

	A_Subtract_B_Model() {
		this.operatorSymbol = "-";
	}
	public void a_op_b() {
		result = a - b;
	}

	public void dealException(Exception e) {
		this.exceptionMessage = "不可能发生";
	}
	
}
//乘模型
class A_Multiply_B_Model extends A_Op_B_Model {
	A_Multiply_B_Model() {
		this.operatorSymbol = "*";
	}
	public void a_op_b() {
		result = a * b;
	}

	public void dealException(Exception e) {
		this.exceptionMessage = "不可能发生";
	}
	
};
//除模型
class A_Divide_B_Model extends A_Op_B_Model {

	A_Divide_B_Model() {
		this.operatorSymbol = "/";
	}
	public void a_op_b() throws Exception {
		if (a % b != 0) {
			throw new Exception("不能整除");
		}
		result = a / b;
	}

	public void dealException(Exception e) {
		this.exceptionMessage = e.getMessage();
	}
	
}

class A_Op_B_View implements A_Op_B_Concept {

	/**
	 * 视图可选用的实体模型 +、-、*、/
	 */
	Map<String, A_Op_B_Model> opMap = new HashMap<String, A_Op_B_Model>();

	{
		A_Op_B_Model[] models = new A_Op_B_Model[]{
				new A_Add_B_Model(),
				new A_Subtract_B_Model(),
				new A_Multiply_B_Model(),
				new A_Divide_B_Model()
		};
		for (int i = 0; i < models.length; i++) {
			opMap.put(models[i].getOperatorSymbol(), models[i]);
		}
	}

	
	A_Op_B_Model model; //视图使用一个模型
	
	public void readA() {
		int num = Util.readInt("a = ");
		model.setA(num);
	}

	public void readB() {
		int num = Util.readInt("b = ");
		model.setB(num);
	}

	public void readOp() throws Exception {
		String op = Util.readString("op = ");
		model = opMap.get(op);
		if (model == null) {
			throw new Exception("不识别的运算符[" + op + "], 可以的运算符如下: " + opMap.keySet());
		}
	}
	
	/**
	 * 视图的计算, 依赖于模型的计算
	 * @throws Exception 
	 */
	public void a_op_b() throws Exception {
		readOp();
		
		readA();
		readB();
		
		try {
			model.a_op_b();
			showResult();
		} catch (Exception e) {
			dealException(e);
		}
	}
	
	public void showResult() {
		System.out.println("a " + model.getOperatorSymbol() + " b = " +
			"" + model.getA() + " " + model.getOperatorSymbol() + " " + model.getB() + " = " +
			"" + model.getResult());
	}

	public A_Op_B_Model getModel() {
		return model;
	}

	public void setModel(A_Op_B_Model model) {
		this.model = model;
	}

	public void showExceptionMessage() {
		System.out.println("*************ERROR************");
		System.out.println(this.model.getExceptionMessage());
		System.out.println("******************************");
	}
	
	public void dealException(Exception e) {
		model.dealException(e);
		showExceptionMessage();
	}
}

/*=========================================*\
	step 3 安装驱动 ---驱动实体在计算机上运行
	
	把实体组织起来执行
\*=========================================*/
public class Drive {

	A_Op_B_View view = new A_Op_B_View();

	public void drive() {
		for (int i=0; ; i++) {
			System.out.println("=============================");
			try{	
				view.a_op_b();
			} catch (Exception e) {
				System.out.println(e.getMessage());
				continue;
			}
		}
	}
	
	public static void main(String[] args) {
		Drive drive = new Drive();
		drive.drive();
	}
}


/**
 * 工具类
 * @author yanchangyou
 *
 */
class Util {
	public static int readInt(String msg) {
		System.out.print(msg);
		int result = -1;
		Scanner scanner = new Scanner(System.in);
		try {
			result = scanner.nextInt();
		} catch (Exception e) {
			System.out.println("输入整数错误,重写输入");
			result = readInt(msg);
		}
		return result;
	}

	public static String readString(String msg) {
		System.out.print(msg);
		String result = null;
		Scanner scanner = new Scanner(System.in);
		result = scanner.nextLine();
		return result;
	}
}
 

 

 

分享到:
评论
2 楼 hustlxjaw 2010-10-08  
我来自土星。
1 楼 Hafeyang 2010-09-20  
我来自火星。

相关推荐

    c# 基础学习系列教程

    - **使用**:在程序中引用变量。 - **5.2 常量** - **声明**:使用`const`关键字。 - **值**:必须在声明时赋值。 - **5.3 小结** 正确使用变量和常量有助于提高代码的可读性和维护性。 **第六章 类型转换*...

    MATLAB与信号处理

    - **4.3.3 符号矩阵的乘、除运算**: `A * B`, `A ./ B`。 - **4.3.4 符号变量替换**: `subs(expr, x, 2)`。 **4.4 符号微积分运算** - **4.4.1 确定符号变量**: - `syms x`。 - **4.4.2 符号微分运算**: `diff...

    选修2-1-第三章-空间向量及其运算知识点汇总.doc

    空间向量及其运算是高中数学选修2-1第三章中的核心内容,它涉及多个重要概念和定理,是解决空间几何问题的关键工具。以下是这一章的知识点详细说明: 1. **空间向量的基本概念**: - **空间向量**:在三维空间中,...

    空间向量的数乘运算公开课PPT学习教案.pptx

    空间向量的数乘运算是线性代数和几何中基础而重要的概念,它涉及到向量与标量的乘法操作。在这个公开课PPT中,主要讲解了以下几个关键知识点: 1. **空间向量的数乘定义**: 实数λ与空间向量**a**的乘积是一个新...

    CSP-J初赛模拟题1.pdf

    - **面向对象与编译执行**:选项B(C++)是一种支持面向对象编程的语言,并且需要经过编译后才能执行。 - **二进制补码运算**:了解二进制补码加法的基本原理和运算规则。 - **十进制与八进制数之间的转换**:掌握不同...

    聚焦典型题人教B空间向量及其运算PPT学习教案.pptx

    根据向量平行定理,如果向量a和b共线,那么存在一个标量λ使得a = λb(b≠0)。 - **共面向量**:如果三个或更多向量可以在同一平面上表示,它们是共面向量。如果两个向量a和b不共线,那么向量p与a和b共面,意味着...

    C#开发教程

    - **概念介绍**:.NET是微软推出的一项面向未来的计算平台和服务框架。它的目标在于打破现有Web站点的孤立状态,构建一个可以相互交换组件的网络环境。 - **背景**:.NET的发布标志着微软对于互联网应用发展的一个...

    C#教程.pdf

    `相当于`a = a + b;`。 - **7.4 关系操作符和关系表达式** - **关系操作符**:用于比较两个值。 - **关系表达式**:返回布尔值true或false。 - **7.5 逻辑操作符和逻辑表达式** - **逻辑操作符**:用于连接多个...

    2021-2022计算机二级等级考试试题及答案No.3985.docx

    - 使用**【格式】**菜单下的**【更改大小写】**功能来调整文档中单词的大小写格式。 ### 变量命名规则 - **题目内容**:下列标识符中,()不是正确的变量名? - A. int - B. one-hundred - C. 1thing - D. thing...

    C Sharp完全手册.pdf

    - **定义与使用**:如何定义和使用命名空间。 - **16.3 使用指示符** - **using指令**:using指令的使用方法。 - **16.4 程序示例** - **示例代码**:使用命名空间和using指令的完整程序示例。 - **16.5 小结** ...

    java数据结构

    - 解决形如`a[n] = c1*a[n-1] + c2*a[n-2] + ...`的问题。 - **5.3.3 非齐次递推关系的解** - 包含非齐次项的情况。 - **5.3.4 Master Method** - 一种用于解决分治算法时间复杂度的方法。 **5.4 分治法** - **...

    visual basic程序设计教程(中国铁道出版社)课后习题参考答案.doc

    - **B**:在Visual Basic中,可以使用多种方法来创建控件。 - **C**:Visual Basic支持事件驱动的编程模型。 - **B**:窗体是用户界面的基本组成部分。 - **C**:Visual Basic项目通常保存为VBP文件。 - **A**...

    Java语言入门教程概览

    - 定义: `public static int add(int a, int b) { return a + b; }` - 调用: `int result = add(1, 2);` - **返回类型**: 可以是基本类型、引用类型或`void`。 #### 7. 面向对象编程(OOP) - **类和对象**: - 类...

    2021-2022计算机二级等级考试试题及答案No.13357.docx

    - **题目**: 设A=”ASP”,B=“.NET”,以下()可以得到结果”ASP.NET”。 - A. A&B - B. A+B - C. A&+B - D. A-B - **正确答案**: B - **解析**: 在 VBA 或 Access 中,使用 & 进行字符串连接。 #### 18. ...

Global site tag (gtag.js) - Google Analytics