大话设计模式之<一>计算器的深思
一个面试题引发的深思,试问我们会如何用面向对象的语言写一个计算器,自从我学习了高级编程之后,面向对象的思想也算是深入在我的编程思想里面,从最开始学习的人类到各色人种,及动物到猫狗鼠这样的例子,我甚至听、看的不厌其烦,在学校的时候没有代码的基础总是忘记这样的特性,总是缠着大神给解释,到现在,也终于是有了深刻的体会,计算器的这个例子已经看过两三遍了,每一次看都是一次新的认识。
在小菜和大鸟的讨论中,一个计算器的实现呈现了三个主要的过程:(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)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个 ...
随机推荐
- Netsuite > Foreign Currency Revaluation 外币评估
MENU: Transactions > Financial > Revalue Open Currency Balances 使用频率: - 每个月月底,结账前, 手工操作. - 或者在 ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) C
Description Santa Claus has Robot which lives on the infinite grid and can move along its lines. He ...
- 使SWT/JFace支持跨平台
由于SWT的实现机制,在不同平台下,必须引用不同swt*.jar. 由于这个瓶颈,我们要为不同的平台编译不同的版本.但是这是可以避免的.这将是本文要讨论的内容. 我一共google到了3种soluti ...
- Sublime Text的常用插件
工欲善其事,必先利其器.好的插件会更多的帮助我们装逼. 最新感悟:也不要装太多的插件.有些无用的插件可以删除,有时反而臃肿.bloger下载官方最新稳定版st3 3126下载下来25M左右.安装十来个 ...
- Codeforces Round #388 (Div. 2) A,B,C,D
A. Bachgold Problem time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Stl源码剖析读书笔记之Alloc细节
阅读基础: Foo *pf = new Foo; 执行了两个步骤: 1)::operator new 向系统申请内存. 2) 调用Foo::Foo()构造函数构造实例. ==> 申请内存,构造 ...
- 实验一 DOS
实验一.DOS实验 一. 实验目的 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统,就连眼下流行的Windows9x/ME系统都是以它为基础 ...
- table布局的简单网页
---恢复内容开始--- 由于<body>标签的图片不能够拉伸, 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使 ...
- php总结 --- 18. 七牛云存储
第三方资源拉取 /** * 七牛云抓取文件 * @param string $url 文件URL地址 * * 参考地址:http://developer.qiniu.com/code/v6/api/k ...
- ps中的位图,矢量图,颜色模式
什么是位图?什么是矢量图? 位图是由像素组成的图像,在缩放和旋转的时候容易失真,同时文件容量较大 矢量图是根据几何特性来绘制的图形,通过数学公式计算获得的,不易制作色彩变化太多的图象 颜色模式 RGB ...