预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共15页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C#面向对象设计模式纵横谈 1.面向对象设计模式与原则 李建忠 www.lijianzhong.com 上海祝成科技高级讲师 设计模式简介 每一个模式描述了一个在我们周围不断重复 发生的问题,以及该问题的解决方案的核 心。 ——ChristopherAlexander 设计模式描述了软件设计过程中某一类常见 问题的一般性的解决方案。 面向对象设计模式描述了面向对象设计过程中、特 定场景下、类与相互通信的对象之间常见的组织关 系。 人是一个经验性的动物 GoF23种设计模式 •历史性著作《设计模式:可复用面向对象软件的基础》一书中描述了 23种经典面向对象设计模式,创立了模式在软件设计中的地位。该书 四位作者被人们并称为GangofFour(GoF),“四人组”,该书描述 的23种经典设计模式又被人们称为GoF23种设计模式。 •由于《设计模式:可复用面向对象软件的基础》一书确定了设计模式 的地位,人们通常所说的设计模式隐含地表示“面向对象设计模式”。 但这并不意味“设计模式”就等于“面向对象设计模式”,也不意味着GoF 23种模式就表示了所有的“面向对象设计模式”。除了“面向对象设计模 式”外,还有其他设计模式。除了GoF23种设计模式外,还有更多的 面向对象设计模式。 •GoF23种设计模式是学习面向对象设计模式的起点,而非终点;本 培训课程的目标是让学员在建立在有效方法的基础上,掌握GoF23 种设计模式。 设计模式与面向对象 •面向对象设计模式解决的是“类与相互通信的对象之间的组织关系, 包括它们的角色、职责、协作方式几个方面。 •面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是 那些可以满足“应对变化,提高复用”的设计。 •面向对象设计模式描述的是软件设计,因此它是独立于编程语言的, 但是面向对象设计模式的最终实现仍然要使用面向对象编程语言来表 达,本课程基于C#语言,但实际上它适用于支持.NET框架的所 有.NET语言,如VisualBasic.NET、C++/CLI等。 •面向对象设计模式不像算法技巧,可以照搬照用,它是建立在对“面 向对象”纯熟、深入的理解的基础上的经验性认识。掌握面向对象设 计模式的前提是首先掌握“面向对象”! 从编程语言直观了解面向对象 •各种面向对象编程语言相互有别,但都能看到它们对面向对象三大机 制的支持,即:“封装、继承、多态” –封装,隐藏内部实现 –继承,复用现有代码 –多态,改写对象行为 •使用面向对象编程语言(如C#),可以推动程序员以面向对象的思维 来思考软件设计结构,从而强化面向对象的编程范式。 •C#是一门支持面向对象编程的优秀语言,包括:各种级别的封装支 持;单实现继承+多接口实现;抽象方法与虚方法重写。 但OOPL并非面向对象的全部 •通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对 象的全部,甚至只是浅陋的面向对象。 •OOPL的三大机制“封装、继承、多态”可以表达面向对象的所有概 念,但这三大机制本身并没有刻画出面向对象的核心精神。换言之, 既可以用这三大机制做出“好的面向对象设计”,也可以用这三大机制 做出“差的面向对象设计”。不是使用了面向对象的语言(例如C#), 就实现了面向对象的设计与开发!因此我们不能依赖编程语言的面向 对象机制,来掌握面向对象。 •OOPL没有回答面向对象的根本性问题——我们为什么要使用面向对 象?我们应该怎样使用三大机制来实现“好的面向对象”?我们应该遵 循什么样的面向对象原则? •任何一个严肃的面向对象程序员(例如C#程序员),都需要系统地学 习面向对象的知识,单纯从编程语言上获得的面向对象知识,不能够 胜任面向对象设计与开发。 从一个示例谈起 示例场景: 我们需要设计一个人事管理系统,其中的一个功能是对各种不同类型 的员工,计算其当月的工资——不同类型的员工,拥有不同的薪金计 算制度。 结构化做法 1。获得人事系统中所有可能的员工类型 2。根据不同的员工类型所对应的不同的薪金制度,计算其工资 enumEmployeeType{//计算工资程序 Engineer;If(type==EmployeeType.Engineer){ Sales;…… Manager;} …elseif(type==Employeetype.Sales){ }…… } 面向对象设计 1。根据不同的员工类型设计不同的类,并使这些类继承自一个 Employee抽象类,其中有一个抽象方法GetSalary。 2。在各个不同的员工类中,根据自己的薪金制度,重写(override) GetSalary方法。 classEngineer:Employee{ abstractcl