面向对象设计模式纵横谈

时间:2019-09-13 16:54来源:www.8364.com
第一讲:1. 面向对象设计情势与标准 设计情势简单介绍:       每多少个情势描述了二个在我们周边不断重复产生的难点,以及该难点的技术方案的主旨。                 

第一讲:1. 面向对象设计情势与标准

设计情势简单介绍:

       每多少个情势描述了二个在我们周边不断重复产生的难点,以及该难点的技术方案的主旨。
                                                        ——Christopher Alexander{建筑师}

软件设计员对设计情势的定义的知情:

(1)设计方式描述了软件设计进程中某一类常见难点的家常便饭的缓慢解决方案。
(2)面向对象设计格局描述了面向对象设计进程中、特定情景下、类与互相之间通讯的靶子中间常见的组织关系。
(3)人是几个经验性的动物

 

GoF23 种设计形式是面向对象设计格局的功底、但不是设计情势的全方位
• 历史性文章《设计格局:可复用面向对象软件的根底》一九九二一书中描述了23种非凡面向对象设计方式,创制了格局在软件设计中的地位。该书三人小编被大家并称呼Gang of Four (GoF),“几人组”,该书呈报的23种杰出设计形式又被大家誉为GoF23 种设计格局。
• 由于《设计形式:可复用面向对象软件的功底》一书鲜明了设计格局的地方,大家平时所说的设计格局隐含地球表面示“面向对象设计格局”。但那并不代表“设计方式”就也正是“面向对象设计方式”,也不意味着GoF23种形式就表示了具有的“面向对象设计形式”。除了“面向对象设计情势”外,还会有其余设计格局。除了GoF23 种设计格局外,还可能有越多的面向对象设计方式。
• GoF23 种设计格局是上学面向对象设计形式的源点,而非终点;本培养陶冶课程的对象是让学员在创设在使得措施的根基上,明白GoF23种设计格局。

 

设计情势与面向对象
• 面向对象设计情势消除的是“类与相互通讯的靶子之间的组织关系,蕴涵它们的角色、任务、合作方法多少个方面。
• 面向对象设计方式是“好的面向对象设计”,所谓“好的面向对象设计”是这么些能够满足“应对转移,升高复用”的规划。{“源代码就是规划”,“好的形式是透过不停的重构”}
• 面向对象设计方式描述的是软件设计,因而它是单身于编制程序语言的,可是面向对象设计格局的末尾达成如故要运用面向对象编制程序语言来发挥,本课程基于C#语言,但实质上它适用于补助.NET框架的全体.NET语言,如Visual Basic.NET、C++/CLI等。
• 面向对象设计形式不像算法技巧,可以照搬照用,它是成立在对“面向对象”熟谙、深刻的知情的基础上的经验性认知。精通面向对象设计情势的前提是首先驾驭“面向对象”!

 

基础:从编制程序语言直观驾驭面向对象 {至少在语言层精晓面向对象,完毕层领会面向对象}
• 各样面向对象编制程序语言相互区分,但都能阅览它们对面向对象三大机制的支撑,即: “封装、承继、多态”
    – 封装,隐敝其间贯彻
    – 承袭,复用现存代码
    – 多态,改写对象行为
• 使用面向对象编制程序语言(如C#),能够拉动技术员以面向对象的研讨来钻探软件设计结构,进而加剧面向对象的编制程序范式。
• C#是一门匡助面向对象编制程序的名特别降价语言,富含:种种级其他卷入帮忙;单达成持续+多接口实现;抽象方法与虚方法重写。

 

但OOPL实际不是面向对象的全体{应用面向对象的语言与应用面向对象设计情势是四个精光两样的场地,驾驭面向对象语言不可能印证你精晓面向设计情势}
• 通过面向对象编程语言(OOPL)认知到的面向对象,而不是面向对象的整套,乃至只是半涂而废的面向对象。
• OOPL的三大机制“封装、继承、多态” 能够宣布面向对象的装有概念,但这三大机制自己并从未刻画出面向对象的基本精神。换言之,不仅可以够用那三大机制做出“好的面向对象设计”,也足以用那三大机制做出“差的面向对象设计”。不是接纳了面向对象的言语(比方C#),就达成了面向对象的宏图与付出!因而大家不能够借助理编辑程语言的面向对象机制,来支配面向对象。
• OOPL未有答应面向对象的根性情难题——大家为何要运用面向对象?大家理应怎样使用三大机制来落到实处“好的面向对象”? 我们相应遵从什么的面向对象原则?
• 任何二个尊严的面向对象程序猿(举例C#程序猿),都须求系统地学习面向对象的学问,单纯从编制程序语言上获得的面向对象知识,不能胜任面向对象设计与费用。

 

从叁个演示谈起{什么样的宏图才是面向设计目标设计}
大家要求规划壹个人事管理系统,个中的七个效能是对各样不相同类型的职员和工人,总结其前些日子的薪俸——今非昔比档案的次序的职员和工人,具有分歧的薪资总计制度
演示场景:(1)结构化做法(pasicalC)
1。得到人事系统中兼有希望的职员和工人类型
2。依据分裂的职工类型所对应的不一致的薪俸制度,总计其薪给
enumEmployeeType{Engineer;Sales;Manager;…}
// 计算报酬程序
If ( type==EmployeeType.Engineer) {……}
else if (type== Employeetype.Sales) {……}

 

演示场景:(2)面向对象设计
1。遵照分化的职员和工人类型设计分化的类,并使这一个类传承自一个Employee抽象类,个中有一个华而不实方法GetSalary。
2。在逐个分歧的职员和工人类中,依照自身的薪酬制度,重写(override)GetSalary方法。
abstract class Employee{

public abstract intGetSalary();
}
class Engineer: Employee{

public override intGetSalary() {
……
}
}
class Sales: Employee{

public override intGetSalary() {
……
}
}
// 展现报酬程序
Employee e=emFactory.GetEmployee(id);
MessageBox.Show( e.GetSalary());

当今需求变动了{}……
乘势客商公司工作范围的扩充,又冒出了越来越多品类的职工,举个例子钟点工、计件工……等等,那对人事管理系统提议了挑衅——原有的顺序必须改换。
示范场景:(1)结构化做法
差一些具备关乎到职工类型的地点(当然包罗“计算薪给程序”)都亟待做退换……那个代码都须要再度编写翻译,重新安插…….
(2)面向对象做法
只须要在新的公文里扩展新的职员和工人类,让其持续自Employee抽象类,同仁一视写GetSalary()方法,然后在EmployeeFactory.GetEmployee方法中依据有关准则,爆发新的职工类型就能够了。别的地点(呈现薪酬程序、Engineer类、Sales类等)则没有供给做其余改换。

 

重新认知面向对象
• 对于眼下的事例,从宏观层面来看,面向对象的营造格局更能适应软件的转移,能将转移所拉动的震慑减为最小
• 从微观层面来看,面向对象的方法越来越强调各类类的“权利”,新增加职员和工人类型不会默化潜移原来职员和工人类型的完成代码——那更契合实际的社会风气,也更能调整转换所影响的限制,究竟Engineer类不应为新扩大的“钟点工”来结账……
• 对象是什么样?{不尊崇内部的环节}。
– 从概念层面讲,对象是某种具有权利的空洞{}。
– 从原则层面讲,对象是一名目多数能够被别的对象使用的集体接口
– 从语言完毕规模来看,对象封装了代码和数码{封装了表现和景色}。
• 有了那么些认知以往,如何才能设计“好的面向对象”?
– 遵循一定的面向对象设计条件
– 熟练一些首屈一指的面向对象设计情势

从统一计划条件到设计格局
• 针对接口编制程序,并不是对准落实编制程序– 客商不要求驾驭所选用对象的一定项目,只须要知道对象具有客商所梦想的接口。
• 优先使用对象组合,实际不是类承接– 类承继平时为“白箱复用”,对象组合日常为“黑箱复用”。承接在某种程度上破坏了封装性,子类父类耦合度高;而指标组合则只供给被重组的对
象具有能够定义的接口,耦合度低。
• 封装变化点
– 使用封装来创立对象之间的分界层,让设计者能够在分界层的边缘实行修改,而不会对另一侧发生不良的震慑,进而完毕档次间的松耦合。
• 使用重构获得情势——设计格局的选拔不宜先入为主,一上来就利用设计情势是对设计形式的最大误用。未有一步到位的设计情势。相当慢软件开辟实施提倡的“Refactoring to Patterns ”是日前常见公众感觉的最棒的采取设计格局的措施。{源代码正是陈设}

 

几条更实际的布置标准
• 单一职分规范(SRP):
– 二个类应该独有三个挑起它生成的缘由。
• 开放密闭原则(OCP):
– 类模块应该是可扩大的,不过不可修改(对增添开放,对改造密封)
• Liskov 替换原则(LSP):
子类必需能够替换它们的基类
• 依赖倒置原则(DIP):
– 高层模块不应该依附于低层模块,二者都应有借助于肤浅。
– 抽象不应有依据于实现细节,达成细节应该借助于肤浅。
接口隔开分离原则(ISP):
– 不应该强迫客户程序信赖于它们并非的艺术。

讲座总计
• 设计形式描述了软件设计进度中某一类常见难点的平凡的缓慢解决方案。面向对象设计格局描述了面向对象设计过程中、特定情景下、类与相互通讯的指标时期常见的协会关系。
• 浓密明白面向对象是学好设计格局的根底,精通一定的面向对象设计规范才干把握面向对象设计格局的精髓,进而实现灵活运用设计方式。
• 三大主导面向对象设计基准
– 针对接口编程,实际不是指向落到实处编制程序
– 优先利用对象组合,并不是类承继
– 封装变化点
• 使用重构获得格局。敏捷软件开拓实行提倡的“Refactoring to Patterns”是时下大面积公认的最棒的使用设计情势的章程。

编辑:www.8364.com 本文来源:面向对象设计模式纵横谈

关键词: