设计模式: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”是时下广泛公认的最好好之利用设计模式的方。

admin

网站地图xml地图