大话设计模式之<一>计算器的深思

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

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

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

上一篇:springmvc多个视图解析器


下一篇:[日常摸鱼]bzoj4802 欧拉函数-PollardRho大整数分解算法