C#面向对象设计模式纵横谈1

来源:互联网 发布:淘宝网店模板 编辑:程序博客网 时间:2024/05/21 07:01

面向对象设计模式描述里面向对象设计过程中、特定场景下、
类与相互通信的对象之间常见的组织关系。

设计模式是通过不断的重构得来的。

敏捷开发:源代码就是设计

懂面向对象设计模式的前提:懂面向对象

面向对象的三大机制:封装,继承,多态
封装:隐藏内部实现,和外界去隔离一下,外部的接口是倾向
与稳定的,内部的实现可以是一个版本的迭代,可以随着
软件需求的改变不断的更改,外部的接口尽量的稳定。
继承:代码的重用
多态:改写对象行为

使用面向对象编程语言,可以推动我们作为程序员以面向对象
的思维思考软件设计结构,迫使我们朝这个方向努力,强化
面向编程范式。

场景:
需要设计一个人事管理系统,其中的一个功能是对各种不同
类型的员工,计算器当月的工资——不同类型的员工,拥有
不同的薪资技术制度。

结构话做法:
我要知道人事系统中有多少种类型的员工,根据不同的员工
类型对应的不同的薪资算法

enum EmployeeType{    Engineer;    Sales;    Manager;}//计算工资程序if(type==EmployeeType.Engineer){    //...}if(type==EmployeeType.Sales){    //...}

面向对象做法:
1、根据不同的员工类型,设计不同的类,并且使这些类
继承Employee抽象类,里面有一个getsalary()方法,然后
在不同的员工类中根据自己的薪资算法重写getSalary方法。

不可以杜绝改变,只能是降低改变的影响。

这两种设计都做好之后,然后需求变了,公司规模不断的扩
大,员工类型不断变多,公司也需要把这些员工纳入到他们
的人事管理系统,这是程序需要调整:

结构话做法的调整:
所有涉及到员工类型的地方,都需要做改变,所有写有
if else的地方,都要补上一个if else,这些代码都需要
重新编译重新部署。

面向对象做法的调整:
只需要在新的文件中添加新的员工类,然后让其继承自
Employee抽象类。其他地方不需要做任何改变。

面向对象的做法,其实是管理客户需求的改变。
面向对象的构建方式,更能适应软件需求的变化,能将变化
所带来的影响减到最小。
新增的一个类,严格来讲不能称之为改变,这叫扩展。

什么叫扩展:举个例子,有一个凳子,现在要让这个凳子
防水防火,扩展的做法就是在凳子外层做一个防水防火层,
凳子的内部并没有改变,这称之为扩展。
而结构话做法就是把这个凳子重新锯去,把凳子的木头材料
换成防水防火的材料。

从微观层面看,面向对象的方法更强调各个类的责任,各个
类的职责,新增员工类型不会影响原来员工的实现代码。

对象是什么?
对象已经不简简单单是托管堆上的一块内存,实现层的机制
理解,它是一块托管的内存。
从概念层面理解对象是什么:
1.对象是某种拥有责任的抽象;(比如说Engineer(工程
师类),它负责工程师工资等一些的计算)
从规格层面:
对象是一系列可以被其他对象使用的公共接口;我们
主要知道这个对象是干什么的,其实我们并不关心内部
是怎么实现的。
从实现层面:
对象封装了代码和数据。稍微抽象一点就是,对象封装了行为
和状态。

怎么才能设计好的面向对象呢:
1、遵循一定的面向对象设计原则;
2、熟悉 一些典型的面向对象设计模式。

三大设计原则:
1、针对接口编程,而不是针对实现编程;
让方法返回的类型是接口,不会返回某个具体的类型。客户
程序无需知道所使用对象的特定类型,它在使用这个对象的
时候只需要知道对象拥有客户所希望的接口,我只需要知道
你拥有这个接口,我不需要知道你实际的类型。

2、优先使用对象组合,而不是类继承;
类继承通常是一个白箱复用,(白箱复用:大家之间耦合度
非常高,子类父类耦合度很高,你继承了其实你是希望访问
父类的一些东西,继承实际上是破坏了程序的某些封装性,
)而对象组合,只要求被对象组合的对象具有良好的接口,
它的耦合度低。如Engineer要求包含Manager。

3、封装变化点
使用封装来创建对象之间的分割层,让设计者可以在分割层,
在分割的一侧进行修改,而不会对另一测产生不良的影响。
封装有了更深的理解:
之前的封装是信息隐藏,实现隐藏了;
而现在的封装更具有意义。使用封装来创建一个分界层,
把变化的封装在一个地方,把不变的封装在一个地方。

有了这些设计原则,怎么得到设计模式呢?
使用重构得到设计模式。需求变化非常大的软件,设计模式
的应用绝对不能先入为主,一上来就使用设计模式,其实是
对设计模式最大的误用。没有一步到位的设计模式。敏捷
开发,就是使用重构得到模式。 源代码就是设计,其实
整个编程的活动都是在做设计,没有那种方式,几个架构师
分析员设计好之后,拿个程序员就能开发出来,大家需要一个
团队的协作,一个重构,一个迭代式的去重构得到模式。
不要把设计模式当成技巧,技巧时可以直接拿来用的,而设计
模式直接拿来用往往会出错。

几条更具体的设计原则:
1、单一职责原则(SRP)
一个类应该仅有一个引起它变化的原因;

2、开发封闭原则(OCP)
类模型应该是可扩展的,但不可修改(对扩展开发,对更改封闭)

3、里氏替换原则(Liskov替换原则)(LSP)
子类必须能够替换他们的基类

4、依赖倒置原则(DIP)
高层模块不应依赖于底层模块,二者都应该依赖于抽象;
抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
(高层模块:显示员工的工资相对于计算工资是高层模块,计算
工资是基层模块,结构话设计都是依赖于底层模块的。高层模块
改变都是比较小的,而底层模块改变是比较频繁的,如果依赖的
话,就会导致高层模块也需要改)

5、接口隔离原则(ISP)
不应该强迫客户程序依赖他们不用的方法
(可以使用多接口的方式进行隔离)

接口和抽象类区别:
接口是多实现的,可以多继承,接口封装行为合同,推崇多接口。
定义组件间的合同,接口要非常稳定。
抽象类只能单继承。

AOP:面向切面编程

学习设计模式的特定:关注点在设计,不在代码结构。

0 0
原创粉丝点击