[置顶] 设计模式之面向对象再回首
2016-08-07
如果你不能很好的理解对象这个思想,你可以把对象看做是现实生活中的一个个的个体。这里就不在详细介绍对象的概念等知识了,直接说一些我个人对对象一部分知识的理解。为方便阐述,下面以一个小小计算器的Demo做例子展开我对封装和耦合的理解。
<span style="font-family:KaiTi_GB2312;font-size:24px;">namespace 计算器代码V1._0
{
/// <summary>
/// 计算器的原始代码
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入数字A:"); //提示
string A = Console.ReadLine(); //定义string变量A接收用户输入的第一个数字
Console.WriteLine("请输入数字B:"); //提示
string B = Console.ReadLine(); //定义string变量B接收用户输入的第二个数字
Console.WriteLine("选择运算符号:+、-、*、/"); //提示
string C= Console.ReadLine(); //定义string变量C接收用户选择的运算符号
string D = ""; //定义一个string变量D接收计算结果
if (C =="+")
D =Convert.ToString(Convert.ToDouble (A )+Convert.ToDouble (B ));
if (C == "-")
D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(B));
if (C == "*")
D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(B));
if (C == "/")
D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(B));
Console.WriteLine(A + C + B + "的结果是"+D);
Console.ReadKey(true);
}
}
}
</span><span style="font-family:KaiTi_GB2312;font-size:24px;">namespace 简单工厂
{
class Program
{
/// <summary>
/// 客户端代码
/// </summary>
/// <param name="args"></param>
static void Main(string[] args) //客户端代码
{
/*
* 客户端代码
*/
try //Try—Catch 调错语句
{
//输入第一个数字A
Console.WriteLine("请输入数字A:");
string strNumberA = Console.ReadLine();
//输入运算符
Console.WriteLine("请选择运算符号(+、-、*、/)");
string strOperated=Console.ReadLine();
//输入第二个数字B
Console.WriteLine("请输入第二个数字B");
string strNumberB = Console.ReadLine();
//计算程序代码
string strResult = "";
strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperated));
//输出计算结果
Console.WriteLine("计算结果是:{0}",strResult );
Console.ReadLine();
}
catch (Exception ex) //调错语句
{
Console.WriteLine("您的输入有误,请重新输入:{0}",ex.Message );
}
}
}
#region Operation运算类
public class Operation //运算类
{
/// <summary> //运算类代码
/// 运算类代码
/// </summary>
/// <param name="numberA"></param>
/// <param name="numberB"></param>
/// <param name="operate"></param>
/// <returns></returns>
public static double GetResult(double numberA, double numberB, string operate) // 运算类代码
{
double result = 0d;
switch (operate)
{
case "+": //加法
result=numberA +numberB ;
break ;
case "-" : //减法
result = numberA - numberB;
break;
case "*": //乘法
result = numberA * numberB;
break;
case "/": //除法
result = numberA / numberB;
break;
}
return result; //返回值
}
}
#endregion
}
</span><span style="font-family:KaiTi_GB2312;font-size:24px;">namespace 紧耦合和松耦合
{
class Program
{
/*
* 1、分离加减乘除等运算
* 2、修改其中一个不影响其他三个
* 3、力求类之间的松耦合
* 4、通过继承和多态实现
*/
static void Main(string[] args) //客户端代码
{
Operation oper; //声明类型为Operation的变量oper
oper = OperationFactory.createOperate("+"); //调用加法
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine(result );
Console.ReadKey (true );
}
}
public class Operation //运算总部,运算类
{
//声明两个double变量存储数字A和数字B
private double _numberA = 0;
private double _numberB = 0;
//数字A的属性
public double NumberA //数字A的属性
{
get { return _numberA ;}
set { _numberA = value; }
}
public double NumberB //数字B的属性
{
get { return _numberB; }
set { _numberB = value; }
}
/// <summary>
/// 声明一个类显示返回值
/// </summary>
/// <returns></returns>
public virtual double GetResult()
{
double result = 0;
return result;
}
}
public class OperationAdd : Operation //加法类,继承运算类
{
public override double GetResult()
{
double result = 0; //初始化result变量
result = NumberA + NumberB; //执行加法运算
return result; //执行加法后,将结果返回给result
}
}
public class OperationSub : Operation //减法类,继承运算类
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
public class OperationMul:Operation //乘法类,继承运算类
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
public class OperationDiv : Operation //除法类,继承运算类
{
public override double GetResult()
{
double result = 0;
//通过if判断除数不能为零
if (NumberB ==0)
{
throw new Exception("除数不能为0");
}
result = NumberA / NumberB;
return result;
}
}
/// <summary> 简单工厂模式的总结
/// 简单工厂模式
/// 1、实例化对象
/// 2、选择实例化的对象
/// 3、有无在将来增加对象的可能
/// 4、通过简单工厂实现创造实例的过程
/// </summary>
public class OperationFactory //简单工厂模式之简单运算工厂
{
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate )
{
//加法
case "+":
oper = new OperationAdd();
break;
//减法
case "-":
oper = new OperationSub();
break;
//乘法
case "*":
oper = new OperationMul();
break;
//除法
case "/":
oper = new OperationDiv();
break;
}
return oper; //返回值为result
}
}
}</span>
面向对象的概念对于我们来说并不算陌生了。但是让我完全理解面向对象的是《大话设计模式》这本书。面向对象最醒目的地方就是牵一发而不动全身。能够体现出面向对象的代码和不能体现出面向对象思想的代码就好比活字印刷术和印刷术的之间的关系。我们知道活字印刷术的印版上的每一个字都是可以替换的而印刷术的印版就不具备活字印刷术的这种特性了。所以当出现错字、客人要求换字的情况时,活字印刷术只需要替换需要替换的字即可;而印刷术则需要替换全部的印版。两者的这一特性无疑会让大众选择活字印刷术而非印刷术。活字印刷术的特性放到面向对象中就是可维护、可复用、可扩展和灵活性好这四点特性了。设计模式第一遍给我最大的震撼不是接触到模式之后的欣喜,而是一名程序员工作之后坚持学习的精神。
感谢您的宝贵时间,祝生活愉快,谢谢~~
—joker