设计模式:C#面向对象设计模式纵横谈[学习:01.面向对象的设计模式与规范 课程笔记]面向对象设计模式纵横谈:面向对象设计模式与标准(笔记记录)

首先说:1. 面向对象设计模式与法

      
李建忠先生提的《面向对象设计模式纵横谈》,早就看了了,现在产生矣时间重新整理一下,以前的博客【赛迪网】没有了,现在搬到博客园,重新过千篇一律举,也造福以后浏览。

设计模式简介:

     
在始发具体的说话设计模式之前,先来同样首准备的底稿子,也是末端设计模式的发源的文章,没有这些极,后面的设计模式也是枉谈。这些规则是上设计模式的基础,只发生甚好之喻了这些计划基准,对后面的模式之读才见面事半功倍。同时有些概念性的物也以是正一下。

      
每一个模式描述了一个当咱们周围不断重复发生的题材,以及该问题的化解方案的主导。
                                                        ——Christopher
Alexander{建筑师}

    
好了,正式开班,按着视频的相继整理下。**

软件设计师对设计模式的概念的领悟:

设计模式简介**

(1)设计模式描述了软件设计过程遭到之一同近似常见问题之家常的解决方案。
(2)面向对象设计模式描述了面向对象设计过程被、特定情景下、类与彼此通信的靶子中间常见的组织关系。
(3)人是一个经验性的动物

图片 1最初模式的定义来建筑,把模式之感怀解释清楚,所以从最初步讲话起。

 

(1)每一个模式讲述了一个当咱们周围不断重复发生的题材,以及该问题之化解方案的着力

GoF23 种设计模式是面向对象设计模式的根基、但非是设计模式的任何
• 历史性著作《设计模式:可复用面向对象软件的底蕴》1994
一挥毫中描述了23种经典面向对象设计模式,创立了模式于软件设计中之身份。该书四位作者为众人连曰Gang
of Four (GoF),“四人组”,该书讲述的23栽经典设计模式又给人们称作GoF23
种设计模式。

由于《设计模式:可复用面向对象软件的根基》一修确定了设计模式的位置,人们常见所说的设计模式隐含地意味着“面向对象设计模式”。但随即并无意味“设计模式”就相当“面向对象设计模式”,也非表示GoF23栽模式就是代表了具备的“面向对象设计模式”。除了“面向对象设计模式”外,还来另设计模式。除了GoF23
种设计模式外,还有复多之面向对象设计模式。
• GoF23
种设计模式是上学面向对象设计模式的起点,而非终点;本培训科目的目标是于学员当起在使得方法的底蕴及,掌握GoF23种设计模式。

——Christopher Alexander

 

 

设计模式与面向对象

面向对象设计模式解决的凡“类和互动通信的靶子之间的组织关系,包括它的角色、职责、协作方法几个点。

面向对象设计模式是“好的面向对象设计”,所谓“好之面向对象设计”是那些可以满足“应针对转移,提高复用”的宏图。{“源代码就是设计”,“好的模式是由此不鸣金收兵的重构”}

面向对象设计模式描述的凡软件设计,因此它们是独于编程语言的,但是面向对象设计模式的末尾兑现还使动面向对象编程语言来抒发,本学科基于C#语言,但实际上它适用于支持.NET框架的所有.NET语言,如Visual
Basic.NET、C++/CLI等。

面向对象设计模式不像算法技巧,可以照搬照用,它是建立于对“面向对象”纯熟、深入的懂得的底子及之经验性认识。掌握面向对象设计模式的前提是率先掌握“面向对象”!

 

 

(2)设计模式叙述了软件设计过程被某个一样近乎常见问题之寻常的缓解方案。

基本功:从编程语言直观了解面向对象
{至少在语言层了解面向对象,实现交汇了解面向对象}

各种面向对象编程语言相互区分,但犹能够见到它对面向对象三百般机制的支撑,即:
“封装、继承、多态”
    – 封装,隐藏其间贯彻
    – 继承,复用现有代码
    – 多态,改写对象行为

使用面向对象编程语言(如C#),可以促进程序员以面向对象的思索来合计软件设计结构,从而加剧面向对象的编程范式。

C#凡是一致派系支持面向对象编程的美好语言,包括:各种级别的包装支持;单实现持续+多接口实现;抽象方法和虚方法重写。

(3)面向对象设计模式讲述了面向对象设计过程遭到、特定情景下、看似以及彼此通信的对象里面常见的组织关系。

 

 

可是OOPL并非面向对象的全体
{应用面向目标的语言及利用面向目标设计模式是少数只意不同的景象,了解面向对象语言不可知证明您控制面向设计模式}

通过面向对象编程语言(OOPL)认识及的面向对象,并无是面向对象的全,甚至只是浅尝辄止的面向对象。
• OOPL的老三可怜机制“封装、继承、多态”
可以发表面向对象的具有概念,但就三挺机制自我并无写出面向对象的中心精神。换言之,既好据此就三生机制做出“好的面向对象设计”,也得就此当下三深机制做出“差的面向对象设计”。不是运用了面向对象的语言(例如C#),就实现了面向对象的计划与开发!因此我们无能够因编程语言的面向对象机制,来掌握面向对象。

OOPL没有答复面向对象的根本性问题——我们为什么而动用面向对象?我们应该如何利用三万分机制来实现“好的面向对象”?
我们理应按照哪些的面向对象原则?

任何一个严肃的面向对象程序员(例如C#程序员),都待系统地修面向对象的知,单纯从编程语言达到博的面向对象知识,不克独当一面面向对象设计及出。

人数是一个经验性的动物,也就是说人是会总结的

 

 

打一个示范谈起{什么样的规划才是面向设计目标设计}
咱要统筹一个人事管理系统,其中的一个力量是指向各种不同档次的职工,计算其当月的工钱——不等类别的职工,拥有不同的薪水计算制度
示范场景:(1)结构化做法(pasical\C)
1。获得人事系统遭到有或的职工类型
2。根据不同的职工类型所对应之不比之薪水制度,计算其工资
enumEmployeeType{Engineer;Sales;Manager;…}
// 计算工资程序
If ( type==EmployeeType.Engineer) {……}
else if (type== Employeetype.Sales) {……}

GoF23种植设计模式

 

历史性著作《设计模式:可复用面向对象软件的根底》一写被描述了23栽经典面向对象设计模式,创立了模式在软件设计中的身份。该书四各类作者给众人连化作Gang
of
Four(GoF),“四人组”,该书讲述的23种植经典设计模式又让众人称之为GoF23种设计模式。

演示场景:(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());

鉴于《设计模式:可复用面向对象软件的功底》一题确定了设计模式的身份,人们司空见惯所说的设计模式隐含地意味着“面向对象设计模式”。但眼看并无代表“设计模式”就相当“面向对象设计模式”。除了“面向对象设计模式”外,还出其它设计模式。除了GoF23挨设计模式外,还有复多之面向对象设计模式。

当今需变动了{}……
乘机客户公司工作范围之进展,又并发了再次多路的职工,比如钟点工、计件工……等等,这对人事管理系统提出了挑战——原有的顺序要变更。
示范场景:(1)结构化做法
几所有涉及到职工类型的地方(当然包括“计算工资程序”)都得开变更……这些代码都待还编译,重新部署…….
(2)面向对象做法
光待以初的文件里增添新的员工类,让那后续自Employee抽象类,并还写GetSalary()方法,然后在EmployeeFactory.GetEmployee方法吃冲有关条件,产生新的职工类型就得了。其他地方(显示工资程序、Engineer类、Sales类等)则免欲开另外移。

GoF23种植设计模式是上学面向对象设计模式的起点,而无终点;本学科的靶子是让大家以树在使得方式的底蕴及,掌握GoF23种设计模式。

 

 

重新认识面向对象

对于眼前的例子,从本层面来拘禁,面向对象的构建方式又能够适应软件之浮动,能拿转变所带的熏陶减弱为极其小

从微观层面来拘禁,面向对象的章程还强调各个类的“责任”,新增员工类型不会见潜移默化原本员工类型的贯彻代码——这重复符合实际的社会风气,也重会决定转变所影响之限定,毕竟Engineer类不该为新增的“钟点工”来赎特……
• 对象是什么?{不关注内部的环}。
– 从概念层面说,对象是某种拥有责任的空洞{}。
– 从规范层面说,对象是一律层层可以于其他对象下的公家接口
– 从语言实现规模来拘禁,对象封装了代码和数目{封装了行为和状态}。
• 有了这些认识下,怎样才能设计“好之面向对象”?
– 遵循一定的面向对象设计规范
– 熟悉一些天下无双的面向对象设计模式

设计模式与面向对象

自打计划性原则及设计模式
• 针对接口编程,而无是针对性落实编程–
客户无论是需掌握所运用对象的特定类型,只待理解对象具备客户所企望的接口。
• 优先采取对象成,而不是类继承–
类继承通常也“白箱复用”,对象成通常为“黑箱复用”。继承在某种程度上损坏了封装性,子类父类耦合度高;而目标成则只是要求于整合的针对
象具有良好定义的接口,耦合度低。
• 封装变化点

使用封装来创建对象之间的分界层,让设计者可以在分界层的一旁进行改动,而非会见指向任何一侧发生浅的影响,从而实现层次中的松耦合。

使用重构得到模式——设计模式的应用不宜先抱为主,一达标来就是使用设计模式是针对设计模式的绝深误用。没有一步到位的设计模式。迅速软件开发实践提倡的“Refactoring
to Patterns
是目前广公认的卓绝好之以设计模式的法。{源代码就是计划性}

面向对象设计模式解决的凡“类与彼此通信的对象期间的组织关系”,包括她的角色、职责、协作方法几个方面。

 

面向对象设计模式是“好之面向对象设计”,所谓“好的面向对象设计”是那些可以满足“答应本着转移,提高复用”的设计。

几乎长重复现实的统筹条件
• 单一任务规范(SRP):
– 一个类似应该只有发生一个勾她生成之因。
• 开放封闭原则(OCP):
– 类模块应该是只是扩大的,但是不得修改(对扩大开放,对反封闭)
• Liskov 替换原则(LSP):
子类必须能够替换其的基类
• 依赖倒置原则(DIP):
– 高层模块不应该靠让低层模块,二者都该乘让肤浅。
– 抽象不应借助让贯彻细节,实现细节应该依靠让肤浅。
接口隔离原则(ISP):
– 不应当强迫客户程序依赖让它并非的办法。

面向对象设计模式描述的凡软件设计,因此它们是独自于编程语言的,但是面向对象设计模式的最后实现还使利用面向对象编程语言来发表,本学科基于C#言语,但事实上它适用于支持.NET框架的所有.NET语言,如Visual
Basic.NET、C++/CLI等。

讲座总结

设计模式描述了软件设计过程遭到之一同类常见问题之平常的解决方案。面向对象设计模式描述了面向对象设计过程遭到、特定情景下、类以及互动通信的对象期间常见的组织关系。

深刻理解面向对象是学好设计模式的底子,掌握得之面向对象设计基准才能把握面向对象设计模式的精华,从而实现灵活运用设计模式。
• 三格外基本面向对象设计原则
– 针对接口编程,而不是对落实编程
– 优先使用对象成,而未是相仿继承
– 封装变化点
• 使用重构得到模式。敏捷软件开发实践提倡的“Refactoring to
Patterns”是时普遍公认的极致好之以设计模式的点子。

面向对象设计模式不像算法技巧,可以照搬照用,它是起家于对“面向对象”纯熟、深入的晓的基础及之经验性知识。掌握面向对象设计模式的前提是率先掌握“面向对象”!

 

由编程语言直观了解面向对象

各种面向对象编程语言相互区分,但都能够见到其对准面向对象三大机制的支撑,即:“封装、继承、多态”

-封装,隐藏其中贯彻

-继承,复用现有代码

-多态,改写对象行为

动面向对象编程语言(如C#),可以推进程序员以面向对象的盘算来考虑软件设计结构,从而加重面向对象的编程范式。C#举凡同样流派支持面向对象编程的漂亮语言,包括:各种级别的包装支持;单实现连续+多接口实现;抽象方法和虚方法重写。

 

可是OOPL并非面向对象的方方面面

通过面向对象编程语言(OOPL)认识及之面向对象,并无是面向对象的一切,甚至仅仅是浅尝辄止的面向对象。

OOPL的老三颇机制“封装、继承、多态”可以发表面向对象的保有概念,但随即三好机制自我并从未写出面向对象的中坚精神。换言之,既好据此这三深机制做出“好的面向对象设计”,也可以为此就三大机制做出“差的面向对象设计”。不是使了面向对象的言语(例如C#),就落实了面向对象的设计以及开支!因此我们不能够借助编程语言的面向对象机制,来掌握面向对象。

OOPL没有报面向对象的根本性问题——我们怎么而运面向对象?我们应当如何使用三十分机制来实现“好之面向对象”?我们该遵照什么样的面向对象原则?

别一个尊严的面向对象程序员(例如C#程序员),都亟需系统地学习面向对象的知识,单纯由编程语言上取得的面向对象知识,不可知胜任面向对象设计以及开支。

 

从一个工资示例谈起

图片 2

图片 3

 

图片 4

 

重新认识面向对象

于前的例子,从本层面来拘禁,面向对象的构建方式重新能够适应软件之变,能拿变所带的熏陶减弱为极小。

由微观层面来拘禁,面向对象的方法又强调各个类的“责任”,新增员工类型不会见潜移默化原本员工类型的贯彻代码——这重适合实际的社会风气,也重新会决定转变所影响的限定,毕竟Engineer类不应当吗新增的“钟点工”来采购就……

靶是呀?

-从概念层面说,对象是某种拥有责任之架空。

-从原则层面谈,对象是一模一样多样可以吃别对象下的公物接口。

-从言语实现层面来拘禁,对象封装了代码和多少。

生了这些认识后,怎样才能设计“好之面向对象”?

-遵循一定的面向对象设计基准

-熟悉一些一流的面向对象设计模式

 

从今设计条件到设计模式

针对接口编程,而不是针对性落实编程

-客户凭需了解所运用对象的一定项目,只待懂得对象具备客户所梦想之接口

先行使用对象成,而非是近似继承

-类继承通常也“白箱复用”,对象成通常为“黑箱复用”。继承在某种成都上破坏了封装性,子类父类耦合度高;而目标成则单纯要求被做的对象有良好定义之接口,耦合度低。

包装变化点,隔离变化点

-使用封装来创建对象之间的分界层,让设计者可以在分界层的边缘进行改动,而非会见指向其余一侧发生不良的影响,从而实现层次中的松耦合。

动用重构得到模式——设计模式的运不宜先抱为主,一高达来即动设计模式是本着设计模式的最好可怜误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring
to Patterns”是现阶段常见公认的最好的采取设计模式的不二法门。

 

基于以上三长原则而博得5长重复有血有肉的规划基准

纯净任务规范(SRP)

-一个看似应该单纯来一个逗她生成之原委。

放封闭原则(OCP)

-类模块应该是不过扩大的,但是不得修改(对扩大开放,对改变封闭)

Liskov替换原则(LSP)

-子类必须能够替换它的基类

依倒置原则(DIP)

-高层模块不应借助让低层模块,二者都应有依靠让肤浅。

-抽象不应当靠让实现细节,实现细节应该因让肤浅。

接口隔离原则(ISP)

-不应有强迫客户程序依赖让它们并非的法门。

 

总结

设计模式描述了软件设计过程遭到之一平等接近常见问题之家常的解决方案。面向对象设计模式描述了面向对象设计过程遭到、特定情景下、类及彼此通信的对象期间常见的组织关系。

深刻理解面向对象是学好设计模式的功底,掌握得之面向对象设计标准才能把握面向对象设计模式的精粹,从而实现灵活运用设计模式。

其三特别核心面向对象设计条件

-针对接口编程,而休是对准落实编程

-优先采取对象成,而非是近乎继承

-封装变化点

动重构得到模式。敏捷软件开发实践提倡的“Refactoring
to Patterns”是眼下广公认的无限好的使用设计模式的措施。

相关文章