一个面试题引发的深思,试问我们会如何用面向对象的语言写一个计算器,自从我学习了高级编程之后,面向对象的思想也算是深入在我的编程思想里面,从最开始学习的人类到各色人种,及动物到猫狗鼠这样的例子,我甚至听、看的不厌其烦,在学校的时候没有代码的基础总是忘记这样的特性,总是缠着大神给解释,到现在,也终于是有了深刻的体会,计算器的这个例子已经看过两三遍了,每一次看都是一次新的认识。

  在小菜和大鸟的讨论中,一个计算器的实现呈现了三个主要的过程:(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();
}
}
}

  简单工厂总结:简单工厂用于实例某一接口下或者抽象类下的实现类或者子类,表现的是面向对象的封装、继承、多态,降低耦合,减少大量的冗余代码。

大话设计模式之<一>计算器的深思的更多相关文章

  1. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  2. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  3. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  4. 大话设计模式--Python

    作者:五岳 出处:http://www.cnblogs.com/wuyuegb2312 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一 ...

  5. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  6. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  7. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  8. 设计模式("大话设计模式"读书笔记 C#实现)

    前言:毫无疑问 ,学习一些设计模式,对我们的编程水平的提高帮助很大.写这个博客的时候自己刚开始学习设计模式,难免有错,欢迎评论指正. 我学设计模式的第一本书是“大话设计模式”. 1.为什么要学设计模式 ...

  9. 大话设计模式C++版——装饰模式

    女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了).装饰模式的本质是每一个 ...

随机推荐

  1. Cardboard开发教程:使用Unity制作Cardboard全景图片浏览器

    这两年,虚拟现实(VR)领域很火,很多人认为这将会是下一个手机般改变人们生活的技术.目前全球最领先的还是Facebook旗下的Oculus,HTC VIVE,以及最流行的Cardboard.国内多家厂 ...

  2. java:IO流学习小结

    可以看以下内容学习一下: http://blog.csdn.net/zzp_403184692/article/details/8057693

  3. HTML5离线缓存问题

    HTML5离线缓存问题 1.应用程序缓存 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. ...

  4. myeclipse10 优化设置

    http://it.oyksoft.com/post/5898/ 一.Myeclipse10修改字体MyEclipse10是基于Eclipse3.7内核,但在Eclipse的Preferences-〉 ...

  5. [poj2348]Euclid's Game(博弈论+gcd)

    Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9033   Accepted: 3695 Des ...

  6. Http referer origin

    为了防止CSRF的攻击,我们建议修改浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的.如果浏览器不能确定源在哪里,那么在发送的请求里面 ...

  7. mysql事务处理

    事务处理能保证所有的sql操作一次性完成或回滚,mysql默认的MyISAM表类型是不支持事务处理的,如果需要做事务处理,需要把表类型换成InnoDB <?php $dsn='mysql:hos ...

  8. WPF感悟

    WPF感悟 UI层与逻辑层要尽可能地剥离(解耦). Routed Event和Command比Event的耦合度要低. UI层与逻辑层的“血管”是数据关联(Data Binding). 尽量不要试图通 ...

  9. 转载ali面

    引言 首先声明,不要再问LZ谁是林萧,林萧就是某著名程序员小说的主角名字. 写这篇文章的目的其实很简单,算是对之前LZ一篇文章的补充和完善. 之前LZ写过一篇<回答阿里社招面试如何准备,顺便谈谈 ...

  10. JQuery_DOM 节点操作之创建节点、插入节点

    一.创建节点 为了使页面更加智能化,有时我们想动态的在html 结构页面添加一个元素标签,那么在插入之前首先要做的动作就是:创建节点 <script type="text/javasc ...