大话设计模式之<一>计算器的深思
一个面试题引发的深思,试问我们会如何用面向对象的语言写一个计算器,自从我学习了高级编程之后,面向对象的思想也算是深入在我的编程思想里面,从最开始学习的人类到各色人种,及动物到猫狗鼠这样的例子,我甚至听、看的不厌其烦,在学校的时候没有代码的基础总是忘记这样的特性,总是缠着大神给解释,到现在,也终于是有了深刻的体会,计算器的这个例子已经看过两三遍了,每一次看都是一次新的认识。
在小菜和大鸟的讨论中,一个计算器的实现呈现了三个主要的过程:(1)未封装的过程;(2)封装之后的计算器;(3)在简单工厂之下的计算器。
(1)未封装的过程:
//输入扫描器
Scanner sc=new Scanner(System.in);
String operator=sc.next();
Integer num1=sc.nextInt();
Integer num2=sc.nextInt();
Integer result=0;
//判断运算符计算结果
if("+".equals(operator)){
result=num1+num2;
}else if("-".equals(operator)){
result=num1-num2;
}else if("*".equals(operator)){
result=num1*num2;
}else{
result=num1/num2;
}
System.out.println("未封装之前的计算器:"+num1+""+operator+""+num2+"="+result);
(2)封装之后的计算器:
/**
*
* <p>Copyright (c) 2015 htt</p>
* <p>类描述: [计算器类]</p>
* <p>创建人: 马景阳 </p>
* <p>创建时间: [2015-11-12 下午4:38:28] </p>
* <p>修改记录: </p>
*/
class Computer{
private Integer num1;
private Integer num2;
public Computer(Integer num1,Integer num2)
{
this.num1=num1;
this.num2=num2;
}
public Integer add()
{
return num1+num2;
}
public Integer sub()
{
return num1-num2;
}
public Integer multi()
{
return num1*num2;
}
public Integer divide()
{
return num1/num2;
}
}
//输入扫描器
Scanner sc=new Scanner(System.in);
String operator=sc.next();
Integer num1=sc.nextInt();
Integer num2=sc.nextInt();
Integer result=0;
Computer comp=new Computer(num1, num2);
//判断运算符计算结果
if("+".equals(operator)){
result=comp.add();
}else if("-".equals(operator)){
result=comp.sub();
}else if("*".equals(operator)){
result=comp.multi();
}else{
result=comp.divide();
}
System.out.println("未封装之前的计算器:"+num1+""+operator+""+num2+"="+result);
}
(3)在简单工厂之下的计算器:
public static void main(String[] args) {
//输入扫描器
Scanner sc=new Scanner(System.in);
String operator=sc.next();
Integer num1=sc.nextInt();
Integer num2=sc.nextInt();
Integer result=0;
Operator comp=SimpleFactoryImp.createFactoryOperator(operator);
result=comp.getResult(num1, num2);
System.out.println("未封装之前的计算器:"+num1+""+operator+""+num2+"="+result);
}
/**
*
* <p>Copyright (c) 2015 htt</p>
* <p>类描述: [操作符接口]</p>
* <p>创建人: 马景阳 </p>
* <p>创建时间: [2015-11-12 下午4:47:48] </p>
* <p>修改记录: </p>
*/
interface Operator{
Integer getResult(Integer num1,Integer num2);
}
/**
*
* <p>Copyright (c) 2015 htt</p>
* <p>类描述: [减法操作符类]</p>
* <p>创建人: 马景阳 </p>
* <p>创建时间: [2015-11-12 下午4:48:33] </p>
* <p>修改记录: </p>
*/
class SubOperator implements Operator{
@Override
public Integer getResult(Integer num1,Integer num2) {
return num1-num2;
}
}
/**
*
* <p>Copyright (c) 2015 htt</p>
* <p>类描述: [加法操作符类]</p>
* <p>创建人: 马景阳 </p>
* <p>创建时间: [2015-11-12 下午4:48:33] </p>
* <p>修改记录: </p>
*/
class AddOperator implements Operator{
@Override
public Integer getResult(Integer num1,Integer num2) {
return num1+num2;
}
}
/**
*
* <p>Copyright (c) 2015 htt</p>
* <p>类描述: [简单工厂类]</p>
* <p>创建人: 马景阳 </p>
* <p>创建时间: [2015-11-12 下午4:51:27] </p>
* <p>修改记录: </p>
*/
class SimpleFactoryImp{
public static Operator createFactoryOperator(String operator)
{
//判断运算符计算结果
if("+".equals(operator)){
return new AddOperator();
}else{
return new SubOperator();
}
}
}
简单工厂总结:简单工厂用于实例某一接口下或者抽象类下的实现类或者子类,表现的是面向对象的封装、继承、多态,降低耦合,减少大量的冗余代码。
大话设计模式之<一>计算器的深思的更多相关文章
- 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- 大话设计模式--Python
作者:五岳 出处:http://www.cnblogs.com/wuyuegb2312 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一 ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- 《大话设计模式》Python版代码实现
上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- 设计模式("大话设计模式"读书笔记 C#实现)
前言:毫无疑问 ,学习一些设计模式,对我们的编程水平的提高帮助很大.写这个博客的时候自己刚开始学习设计模式,难免有错,欢迎评论指正. 我学设计模式的第一本书是“大话设计模式”. 1.为什么要学设计模式 ...
- 大话设计模式C++版——装饰模式
女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个 ...
随机推荐
- QM模块包含主数据(Master data)和功能(functions)
QM模块包含主数据(Master data)和功能(functions) QM主数据 QM主数据 1 Material Master MM01/MM02/MM50待测 物料主数据 2 Sa ...
- winform 对话框,保存,另存为,还有打印控件
学习的对话框的种类: 1.打开文件对话框(OpenFileDialog) 2.保存文件对话框(SaveFileDialog) 3.字体对话框(FontDialog) 4.颜色对话框(ColorDial ...
- mac os 禁止apache httpd自动启动(转)
mac os 禁止apache httpd自动启动 博客分类: 计算机使用 mac os不像linux有/etc/init.d/rc.local以及service的方式可以设置程序随机启动,而是使 ...
- /usr/include/features.h:367:25:fatal errorXXXXXX类似这种问题
解决方案: sudo apt-get install g++=multilib //至于为什么还没搞清楚,搞清楚在写上来吧!
- 子坐标系C在父坐标系W中的旋转问题
关键词:空间旋转.旋转轴.刚体旋转 用途:相机位姿估计.无人机位姿估计 文章类型:概念.公式总结(本文不带推倒过程,若想了解公式是如何推出来的请自习搜索文献),C++函数展示 @Author:VSha ...
- Linux系统下配置Tomcat
1.将下载好的tomcat文件拷贝至/usr/java文件夹中: cp apache-tomcat-7.0.72.tar.gz /usr/java 2.进入/usr/java文件夹: cd /usr/ ...
- jquery插件 - 学习笔记 (插件参数及函数的调用)
今天研究的是jquery插件的基本写法: 比如我打算写一个名为 ImageZoom 的插件 前台调用: <script src="ImageZoom.js"></ ...
- react1
1.方法用() 里面的每个参数之间用,分隔2.对象(函数.数组)用{} 3.{/*注释...*/} 4 组件的生命周期可分成三个状态:Mounting:已插入真实 DOMUpdating:正在被重新 ...
- 嵌入式Linux学习笔记(0)基础命令。——Arvin
学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹 ...
- Android 6.0权限改变
对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要访问通讯录.短 ...