设计模式: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”是眼前普遍公认的卓绝好的利用设计模式的方法。

相关文章