`
suifeng
  • 浏览: 175847 次
  • 性别: 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  
我来自火星。

相关推荐

    【05-面向对象(下)】

    •一个类可以实现一个或多个接口,继承使用extends关键字,实现接口则使用implements关键字。 实现接口 •一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是...

    计算机二级C语言考试题预测

    (30) 关系数据库管理系统能实现的专门关系运算包括(B) A. 排序、索引、统计 B. 选择、投影、连接 C. 关联、更新、排序 D. 显示、打印、制表 (31) 算法一般都可以用哪几种控制结构组合而成(D) 注:P3 A. 循环、分支、...

    数据结构(C++)有关练习题

    2、 已知a[n]为整数数组,试写出实现下列运算的递归代码(C或C++代码均可): 要求: a. 求数组中的最大整数; b. 求n个数的和; c. 利用堆栈类,将本题a和b的代码改成非递归的方式。 实验报告...

    二级C语言公共基础知识

    (5) 关系数据库管理系统能实现的专门关系运算包括选择、连接和______。 答:投影 (6) 在先左后右的原则下,根据访问根结点的次序,二*树的遍历可以分为三种:前序遍历、______遍历和后序遍历。 答:中序 (7) 结构...

    C语言标准教程第一章 C语言概论

    C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定...

    (谭浩强)c语言学习书

    C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定...

    数据结构习题答案(全部算法)严蔚敏版

    2.2.2 向量中基本运算的实现 2.3 线性表的链表存储结构 2.3.1 单链表与指针 2.3.2 单链表的基本运算 2.4 循环链表和双向链表 2.4.1 循环链表 2.4.2 双向链表 2.4.3 顺序存储结构与链表存储结构的综合分析...

    数据库系统原理A.pdf

    R A B C a b c d a f c b d S A B C b g A d a F 山东海天软件工程专修学院模拟试卷 《数据库系统原理》A试卷 1、 单项选择题(本大题共15小题,每小题2分,共30分) 在每小题列出的四个备选项中只有一个是符合题目...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府...

    数据库系统概论习题集2007-6-10.doc

    第一部分 客观选择题 2 第1章 绪论 2 第2章 关系数据库 3 第3章 ...关系数据库管理系统应能实现的专门关系运算包括(B)。 A.排序、索引、统计 B.选择、投影、连接 C.关联、更新、排序 D.显示、打印、制表 7.五种基本

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府...

    计算机作业答案.doc

    第一章 计算机基础知识 1. 一般认为,世界上第一台电子数字计算机诞生于 A 1946年 B 1952年 C... 下面哪一项不是计算机采用二进制的主要原因 A二进制只有0和1两个状态,技术上容易实现 B 二进制运算规则简单 C 二进制数

    数据库系统原理》.xls

    以上都不是,4,A 1,概念模型表示方法最常用的是( ) ,A.er 方法 B.数据的方法 C.分布式方法 D.面向对象的方法,4,A 1,给定函数依赖f:X Y和g:X Y,则( )。,A.f不等于g B.f不一定等于g C.f等于g D.以上都不是,4,C ...

    [详细完整版]单片机复习.doc

    1.1单片机基本概念 (1)...ALE 、PSEN、RST、EA、WR、RD 2.3 微处理器 CPU分为运算部件和控制部件 (1)运算部件 功能:逻辑运算、算术运算、位操作、数据传输 组成:ALU、A、B、暂存器等 PSW:C、AC、RS1、RS0、OV O

    Spring中文帮助文档

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...

    Spring API

    6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点...

    数据库系统原理练习.doc

    设关系R(A,B,C)和S(A,D),用关系代数的基本运算写出与R S等价的关系代数表达式是___________。 21.设有关系模式R(A,B,C,D),F是R上成立的FD集,F={A C,A D},则R的候选键是 ___________。 22.如果X Y且有YX...

    计算机作业标准答案.doc

    鼠标是快速输入设备,关于键的使用,下列四个说法错误的是 A 大部分操作使用左键 B 有时使用右键 C 根据不同软件要求有时使用中键 D 左、右键的作用完全相同 18. 微处理器具有 A 传输数据的功能B 控制总线数据...

    计算机作业答案.pdf

    鼠标是快速输入设备,关于键的使用,下列四个说法错误的是 A 大 部分操作使用左键 B 有时使用右键 C 根据不同软件要求有时使用中键 D 左、右键的作用完全相同 18.微处理器具有 A 传输数据的功能 B 控制总线数据传送...

Global site tag (gtag.js) - Google Analytics