大话设计模式之<一>计算器的深思
一个面试题引发的深思,试问我们会如何用面向对象的语言写一个计算器,自从我学习了高级编程之后,面向对象的思想也算是深入在我的编程思想里面,从最开始学习的人类到各色人种,及动物到猫狗鼠这样的例子,我甚至听、看的不厌其烦,在学校的时候没有代码的基础总是忘记这样的特性,总是缠着大神给解释,到现在,也终于是有了深刻的体会,计算器的这个例子已经看过两三遍了,每一次看都是一次新的认识。
在小菜和大鸟的讨论中,一个计算器的实现呈现了三个主要的过程:(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)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个 ...
随机推荐
- 【前端】Three.js
Three.js 基本概念 渲染器(Renderer) 渲染器将和Canvas元素进行绑定 场景(Scene) 在Three.js中添加的物体都是添加到场景中的,因此它相当于一个大容器.一般说,场景里 ...
- UVA 11464 偶数矩阵
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 最小化安装的CentOS7挂载ntfs格式的U盘
准备从系统中拷贝一些文件到U盘,插上U盘. 一.获得U盘的设备识别符 fdisk -l 啊哈,我看到了,是/dev/sdb1 二.熟练的挂载 mount /dev/sdb1 /mnt/usb Duan ...
- 新课程开始的第二天,HTML基础制作
天正式开始学习HTML的基础制作,有简单的指令开始入手. 第一天的学习,因为基础,所以觉得还算简单,主要是对网页背景.图片.文字.表格等的编辑,和一部分链接的使用. 由下面的的一个事例,通过所学的简单 ...
- vnc连接kali 2.0 报错:A problem has occurred and the system can't recover.
kali版本: root@kali:~# uname -a Linux kali -kali1-amd64 # SMP Debian -7kali2 (--) x86_64 GNU/Linux 第一步 ...
- php : 基础(2)
常量 常量是相对于变量来说的:是一个其中存储的数据不会也不应该改变的"标识符". 常量的使用,就2个方面:定义,取值. 常量的定义 //常量定义语法1: //define(&quo ...
- 图片懒加载--判断div ul中的li是否已经滑动到可视区域里
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Sublime相关
通过添加 Build System 的方式来使 Sublime Text 3 运行 JS.ES6: 参考文章:如何优雅地使用Sublime Text3 参考书目:<ES6标准入门>阮一峰 ...
- VS.Net 2015 Update3 学习(1) 支持Webpack
让vs.net 编译的时候自动执行webpack 首先 管理员模式下打开 “Developer Command Prompt for VS2015", 是管理员模式啊! 然后进入 cd c: ...
- easyui 随笔
问题1:easyui-datagrid中,如果装载datagrid的表格通过javascript 或者 jquery 来resize,那么将会reload重新加载数据.这样当我们调整的时候不得不重新发 ...