设计模式1

读后感:陆续花了三周时间,阅读了《大话设计模式》的电子书版本。在此之前也阅读过其它讲解设计模式的书,但是往往过于抽象,举例复杂,读起来很是吃力,都坚持不下来;阅读这本书比较轻松。

本书的优点:就是浅显易懂,适合于入门者;

本书的缺点:就是有些地方讲解并不深入全面;并没有给出用.net实现时,如何实现更优;在C#类库中用到了那些模式;举的小例子有时候是便于理解,但是实际工作中,学习者并不能真正会使用,可以列举实际用到企业库,PetShop等等,实际的项目中是如何使用设计模式的;

建议:对于想学习设计模式的人来说,先阅读《大话设计模式》(或者《设计模式深入浅出》)有一个大致的基本概念;然后进一步可以学习设计模式的权威著作GOF的《设计模式》。

《大话设计模式》学习笔记如下

技巧与原理:

如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。——《重构与模式》

软件开发,要求应用程序:可维护、可扩展、可复用、灵活性好。

面对对象编程,可以通过封装、继承和多态把程序的耦合度降低;用设计

模式使程序更加的灵活。

第一章:简单工厂模式

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

第二章:策略模式

定义:

策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

优点:

策略模式使一种定义一系列算法的方法,从概念上来看,所有这些算法完成 的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

策略模式的strategy类层次为contex定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个一个独立的strategy类中,可以在使用这些行为的类中消除条件语句。

策略模式就是用来分封装算法的,但在实践中,我们发现可以用它来封装计划任何类型的规则,只要在分析过程中听到在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。

在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的contex对象。

第三章:单一职责原则

单一职责原则(SRP):就一个类而言,应当仅有一个引起他变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意向不到的破坏。

软件设计真正要做的许多内容,就是发现职责并把这些职责分离。如果你能够想到多于一个的动机去改变这一个类,那么这个类就具有多于一个的职责。

第四章:开放-封闭原则

开放-封闭原则:软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。

特征:(1)对于扩展是开放的;(2)对于更改时封闭的。

无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。

等到变化发生时立即采取行动。

在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离一会发生的同类变化。

面对需要,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。

我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建证券的抽象就越困难。

开发-封闭原则是面向对象设计的核心所在。遵循这个原则可言带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应当仅对程序中呈现出频繁变化的那些部门做出抽象,然而,对于应用程序中的每个部分都可以地抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

第五章:依赖倒转原则

依赖倒转原则(或依赖倒置原则):

A 高层模块不应当依赖低层模块。两个都应该依赖抽象。

B 抽象不应该依赖细节。细节应该依赖抽象。

里氏转换原则(LSP):子类型必须能够替换掉他们的父类型。

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的姓名没有变化。

只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才真正被复用,而子类也能够在父类的基础上增加新的行为。

由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下酒可以扩展。

依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有依赖的关系都是终止于抽象类火灾接口,那就是面向对象的设计,反之那就是过程化的设计了。

第六章:装饰模式

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生产子类更为灵活。

每个装饰对象的实现就和如果使用这个对象分离开了,每个装饰对象只关系自己的工鞥,不需要关系如何被添加到对象链当中。

装饰模式使为已有功能动态地添加更多功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新添加的代码通常装饰了原有类的核心职责或主要行为。在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,

因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象了。

优点:

(1)把类中的装饰功能从类中搬移去除,这样可以简化原有的类。

(2)有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。

第七章:代理模式

代理模式(Proxy):为其它对象提供依照那个代理以控制这个对象的访问。

代理分类:

(1)远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同的地址空间的事实。

(2)虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

(3)安全代理,用来控制真实对象访问时的权限。

(4)智能指引,是指当调用真实的对象时,代理处理另外一些事。

第八章:工厂方法模式

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持封装对象创建过程的优点。

工厂方法的缺点是由于每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

缺点克服:可以使用.NET中的反射。

第九章:原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要指定任何创建的细节。

第十章:模板方法模式

模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构及可重用该算法的某些特定步骤。

模板方法模式是通过把不变行为搬迁到超类,去除子类中的重复代码来体现它的优势。

当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的新闻就会在子类中重复出现。我们通过模板方法模式把这些行为搬迁到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。

posted @ 2010-05-31 11:15  深潭  阅读(240)  评论(1编辑  收藏  举报