代码如下:
新建类 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;
}
}
分享到:
相关推荐
- **使用**:在程序中引用变量。 - **5.2 常量** - **声明**:使用`const`关键字。 - **值**:必须在声明时赋值。 - **5.3 小结** 正确使用变量和常量有助于提高代码的可读性和维护性。 **第六章 类型转换*...
- **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第三章中的核心内容,它涉及多个重要概念和定理,是解决空间几何问题的关键工具。以下是这一章的知识点详细说明: 1. **空间向量的基本概念**: - **空间向量**:在三维空间中,...
空间向量的数乘运算是线性代数和几何中基础而重要的概念,它涉及到向量与标量的乘法操作。在这个公开课PPT中,主要讲解了以下几个关键知识点: 1. **空间向量的数乘定义**: 实数λ与空间向量**a**的乘积是一个新...
- **面向对象与编译执行**:选项B(C++)是一种支持面向对象编程的语言,并且需要经过编译后才能执行。 - **二进制补码运算**:了解二进制补码加法的基本原理和运算规则。 - **十进制与八进制数之间的转换**:掌握不同...
根据向量平行定理,如果向量a和b共线,那么存在一个标量λ使得a = λb(b≠0)。 - **共面向量**:如果三个或更多向量可以在同一平面上表示,它们是共面向量。如果两个向量a和b不共线,那么向量p与a和b共面,意味着...
- **概念介绍**:.NET是微软推出的一项面向未来的计算平台和服务框架。它的目标在于打破现有Web站点的孤立状态,构建一个可以相互交换组件的网络环境。 - **背景**:.NET的发布标志着微软对于互联网应用发展的一个...
`相当于`a = a + b;`。 - **7.4 关系操作符和关系表达式** - **关系操作符**:用于比较两个值。 - **关系表达式**:返回布尔值true或false。 - **7.5 逻辑操作符和逻辑表达式** - **逻辑操作符**:用于连接多个...
- 使用**【格式】**菜单下的**【更改大小写】**功能来调整文档中单词的大小写格式。 ### 变量命名规则 - **题目内容**:下列标识符中,()不是正确的变量名? - A. int - B. one-hundred - C. 1thing - D. thing...
- **定义与使用**:如何定义和使用命名空间。 - **16.3 使用指示符** - **using指令**:using指令的使用方法。 - **16.4 程序示例** - **示例代码**:使用命名空间和using指令的完整程序示例。 - **16.5 小结** ...
- 解决形如`a[n] = c1*a[n-1] + c2*a[n-2] + ...`的问题。 - **5.3.3 非齐次递推关系的解** - 包含非齐次项的情况。 - **5.3.4 Master Method** - 一种用于解决分治算法时间复杂度的方法。 **5.4 分治法** - **...
- **B**:在Visual Basic中,可以使用多种方法来创建控件。 - **C**:Visual Basic支持事件驱动的编程模型。 - **B**:窗体是用户界面的基本组成部分。 - **C**:Visual Basic项目通常保存为VBP文件。 - **A**...
- 定义: `public static int add(int a, int b) { return a + b; }` - 调用: `int result = add(1, 2);` - **返回类型**: 可以是基本类型、引用类型或`void`。 #### 7. 面向对象编程(OOP) - **类和对象**: - 类...
- **题目**: 设A=”ASP”,B=“.NET”,以下()可以得到结果”ASP.NET”。 - A. A&B - B. A+B - C. A&+B - D. A-B - **正确答案**: B - **解析**: 在 VBA 或 Access 中,使用 & 进行字符串连接。 #### 18. ...